# What the verified UI supports

Each part of the Slack client the verified UI draws, the Web API methods it calls and what it leaves out.

This page lists every part of the Slack client the [verified UI](https://www.rystic.ai/docs/simulators/slack/features/verified-ui.md) draws. A test checks each **Works** row through the Web API, so write tasks against those rows; the Web API column names the methods each one calls, which a grader reads.

<!-- BEGIN generated: ui-features (go run ./ingest/cmd/twindocs slack; do not edit) -->

| Area | Works | Gap | Out |
|---|---|---|---|
| shell | 15 | 0 | 9 |
| messages | 14 | 0 | 6 |
| reactions | 4 | 0 | 1 |
| threads | 7 | 0 | 3 |
| conversations | 28 | 1 | 8 |
| files | 9 | 0 | 5 |
| pins & bookmarks | 7 | 0 | 0 |
| people & status | 20 | 1 | 1 |
| scheduling | 8 | 0 | 1 |
| search & navigation | 14 | 1 | 4 |
| apps & views | 2 | 5 | 8 |
| sidebar | 14 | 1 | 6 |
| canvases & lists | 16 | 3 | 4 |

**Works.**

| Area | Feature | Web API |
|---|---|---|
| shell | app load → current actor in the rail avatar and actor switch | `auth.test` |
| shell | workspace name and icon at the top of the sidebar | `team.info` |
| shell | server holds the Socket Mode link; each event refreshes the open page | `apps.connections.open` |
| shell | simulator reset, scenario or seed load, or credential binding → every open page redraws to the new state; a reset also clears the drafts, saved items and sidebar state the browser kept for the old one | — |
| shell | a customer's Socket Mode bot beside the UI receives every envelope it would receive alone, and the open page still shows every write | `apps.connections.open` |
| shell | URLs mirror Slack: /client/`<team>`/`<conversation>`[/thread/`<ts>`] | — |
| shell | rail avatar → switch actor (one bound token per seeded person) | — |
| shell | rail in Slack's order: Home, DMs, Activity, Files, Later, Agents & tools, Admin; the control strip at its foot: Create new, Turn on focus mode, your avatar | — |
| shell | rail foot Create new (+) → Message → pick people → Go to conversation | `conversations.open` |
| shell | rail foot Create new (+) → Channel → name → Create | `conversations.create` |
| shell | rail foot Create new (+) → Canvas → title → Create → the canvas opens at /client/`<team>`/canvases/`<id>`; the Files sidebar's Create new and the Canvases page's + New open the same dialog | `canvases.create` |
| shell | rail foot avatar (and every avatar) shows the person's profile.image_*, the letter tile when there is none | `users.info` |
| shell | ?theme=dark opens Slack's dark theme (set it in the URL, as ?as= sets the person); light is the default | — |
| shell | at 1280×720 and 1024×768 every rail, top bar, header, tab, composer and thread pane control is on screen; shorter windows scroll the rail's tabs and keep the control strip pinned | — |
| shell | rail foot Create new (+) → List → name, and whether it tracks to-dos → Create → the List opens at /client/`<team>`/lists/`<id>`; the Files sidebar's Create new and the Lists page's + New open the same dialog | `slackLists.create` |
| messages | composer → type → Enter or Send button | `chat.postMessage` |
| messages | message list: mrkdwn, mentions, channel links, code blocks, Block Kit section/context, attachments, edited marker, day dividers | `conversations.history` |
| messages | composer formatting bar (bold, italic, strike, code, link, lists, quote, code block) and Show formatting toggle | `chat.postMessage` |
| messages | composer → Emoji button → search → pick | — |
| messages | composer → @ → autocomplete → pick person; # → channel | `users.list` |
| messages | composer Emoji → the picker's Custom section after Frequently Used (aliases drawn as what they name), or search by name → pick → the image in the box; posts :name: and an emoji element | `emoji.list` |
| messages | message list: :name: and its aliases as the custom image, an alias of a standard emoji as that emoji, an image that can't load as :name: | `emoji.list` |
| messages | message list: <!subteam^…> as an @handle pill, the group's handle now (else the label it was posted with) → click → card with name, description, members and View user group | `usergroups.list`, `usergroups.users.list` |
| messages | composer → @ → user groups after people (up to three) → pick → @handle pill; posts <!subteam^ID\|@handle> and a usergroup element | `usergroups.list` |
| messages | own message hover → ⋯ → Edit message → change → Enter | `chat.update` |
| messages | own message hover → ⋯ → Delete message → confirm | `chat.delete` |
| messages | composer → /me waves → Enter (italic me-message) | `chat.meMessage` |
| messages | message hover → More actions → Copy link → clipboard + toast | `chat.getPermalink` |
| messages | unsent composer text survives switching conversations; Drafts & sent lists drafts | — |
| reactions | message hover → Add reaction… → search → pick; quick reaction (white_check_mark, eyes, raised_hands); click someone else's pill; Add reaction… at the end of the pill row | `reactions.add` |
| reactions | reaction pill draws a custom emoji's image; Add reaction… → the picker's Custom section; picking an alias reuses the pill of its image | `emoji.list`, `reactions.add` |
| reactions | click your own reaction pill | `reactions.remove` |
| reactions | hover or focus a reaction pill → who reacted | `reactions.get` |
| threads | N replies → thread pane with root and replies | `conversations.replies` |
| threads | thread pane → Reply… → Enter; message hover → Reply in thread | `chat.postMessage` |
| threads | thread composer → Also send to #channel → Enter | `chat.postMessage` |
| threads | sidebar Threads → /client/`<team>`/threads: every thread the viewer started or replied in, newest activity first; each card shows the root, the latest two replies (Show N more replies for the rest) and a reply box | `conversations.history`, `conversations.replies` |
| threads | thread pane header ⋮ → Copy link → the root's permalink | `chat.getPermalink` |
| threads | Threads view → a card's Reply… box → Enter (Also send to #channel as in the thread pane); the card moves to the top | `chat.postMessage` |
| threads | Threads view → a card's conversation name → the conversation with that thread's pane open | `conversations.replies` |
| conversations | sidebar: Channels, Direct messages, sorted, archived hidden | `users.conversations` |
| conversations | Add channels → Browse channels → list with Join / View | `conversations.list` |
| conversations | channel header (name, topic, member count) and channel details dialog | `conversations.info` |
| conversations | open a conversation → newest messages; scroll up loads older (cursor) | `conversations.history` |
| conversations | header member count → Members tab | `conversations.members` |
| conversations | Add channels → Create a new channel → name, private toggle → Create | `conversations.create` |
| conversations | preview a channel you're not in → Join channel; Browse → Join | `conversations.join` |
| conversations | channel details → Leave channel; sidebar item menu → Leave | `conversations.leave` |
| conversations | channel details → Members → Add people | `conversations.invite` |
| conversations | channel details → Members → person → Remove from channel | `conversations.kick` |
| conversations | channel details → Settings → Archive channel → confirm | `conversations.archive` |
| conversations | archived channel → details → Unarchive channel | `conversations.unarchive` |
| conversations | channel details → Channel name → Edit → Save | `conversations.rename` |
| conversations | channel details → Topic → Edit → Save (header shows it) | `conversations.setTopic` |
| conversations | channel details → Description → Edit → Save | `conversations.setPurpose` |
| conversations | opening a conversation marks it read; message hover → ⋯ → Mark unread | `conversations.mark` |
| conversations | bold sidebar item with count badge, New messages divider, unread pill | — |
| conversations | New message (compose) → pick people → DM or group DM; profile → Message | `conversations.open` |
| conversations | sidebar DM item menu → Close conversation → the DM leaves the sidebar and the DMs list; New message to the person, or a new message from them, brings it back | `conversations.close` |
| conversations | channel header Search in channel, or header ⋮ → Search in channel → the top bar's field opens holding in:#`<channel>` (in:@`<name>` in a DM) → type → Enter → the results view | `search.messages` |
| conversations | channel header ⋮ → Open channel details | `conversations.info` |
| conversations | DM header ⋮ → View full profile | `users.info` |
| conversations | channel header ⋮ → Star channel / Unstar channel → Starred section | — |
| conversations | channel header ⋮ → Copy link → the conversation's URL in this client | — |
| conversations | channel header ⋮ → Leave channel (not in #general) | `conversations.leave` |
| conversations | DM header ⋮ → Close conversation | `conversations.close` |
| conversations | conversation tabs: Add canvas → the channel canvas, made and opened in its tab (titled Canvas while files.info can't name it) | `conversations.canvases.create` |
| conversations | conversation tabs: + → Link → the bookmark dialog → Save (bookmarks.add) | `bookmarks.add` |
| files | composer Attach → Upload from your computer → pick a file (uploads at once, shown in the composer tray) | `files.getUploadURLExternal` |
| files | composer tray: bytes POSTed to upload_url with progress; failed upload → Retry | `upload/v1/{ticket}` |
| files | attach → Enter / Send (composer text is the initial comment; thread_ts in a thread) → message with the file | `files.completeUploadExternal` |
| files | click a file on a message → file viewer: name, type, size, uploader, date, shared in | `files.info` |
| files | rail Files → /client/`<team>`/files: type filter, Shared by me → click opens the viewer | `files.list` |
| files | own file → More → Delete file → confirm (or the viewer's Delete file) | `files.delete` |
| files | image files: inline preview on the message and in the viewer (url_private fetched with the bearer token) | `files-pri/{tf}/{name}` |
| files | file More → Download, or the viewer's Download (url_private_download with the bearer token) | `files-pri/{tf}/download/{name}` |
| files | rail Files → the Files sidebar's Create new (+) → Canvas or List, the same dialogs as the rail's Create new | `canvases.create`, `slackLists.create` |
| pins & bookmarks | message hover → More actions → Pin to this conversation; pinned messages show "Pinned by `<name>`" and a highlight | `pins.add` |
| pins & bookmarks | pinned message → More actions → Un-pin from this conversation, or Pins tab → Un-pin | `pins.remove` |
| pins & bookmarks | conversation header → Pins tab → View message jumps to it | `pins.list` |
| pins & bookmarks | Bookmarks tab → Add a bookmark → link, name → Save | `bookmarks.add` |
| pins & bookmarks | Bookmarks tab → bookmark More → Edit → Save | `bookmarks.edit` |
| pins & bookmarks | conversation header → Bookmarks tab; a bookmark opens its link in a new tab | `bookmarks.list` |
| pins & bookmarks | Bookmarks tab → bookmark More → Remove | `bookmarks.remove` |
| people & status | rail People → /client/`<team>`/people: search by name or title → click a person → profile pane | `users.list` |
| people & status | author name or directory entry → /client/`<team>`/`<conv>`/user_profile/`<user>`: name, display name, title, status, presence, local time, Message | `users.info` |
| people & status | profile pane: email, phone, pronouns; own Edit profile prefills from users.profile.get | `users.profile.get` |
| people & status | People directory → type an email → users.lookupByEmail → that person | `users.lookupByEmail` |
| people & status | presence dot on DM sidebar items, directory avatars and the profile; Active / Away on the profile | `users.getPresence` |
| people & status | your avatar menu → Set yourself as away / Set yourself as active | `users.setPresence` |
| people & status | app load calls users.setActive once per signed-in person | `users.setActive` |
| people & status | your avatar menu → Profile → Edit profile → full name, display name, title → Save Changes | `users.profile.set` |
| people & status | your avatar menu → Update your status → emoji, text or a suggestion, Remove status after → Save; Clear status | `users.profile.set` |
| people & status | Edit profile → Remove photo | `users.deletePhoto` |
| people & status | your avatar menu shows Pause notifications with the paused-until state (disabled); zZ and Paused until on a paused person's avatar and profile | `dnd.info` |
| people & status | People directory: one dnd.teamInfo for the listed people → zZ on paused people | `dnd.teamInfo` |
| people & status | custom profile field labels on the profile pane | `team.profile.get` |
| people & status | sidebar Directories → User Groups tab: every group with its handle, member count and description; search; Show disabled groups | `usergroups.list` |
| people & status | User Groups → a group → /client/`<team>`/people/usergroup/`<id>`: name, handle, description and members; a member opens their profile | `usergroups.users.list` |
| people & status | User Groups → Create User Group → name, handle, description → Create → the new group's pane; a refusal (name or handle taken) stays in the dialog | `usergroups.create` |
| people & status | group pane → Edit → name, handle, description → Save Changes | `usergroups.update` |
| people & status | group pane → Edit members → tick and untick people (find by name) → Save; at least one member | `usergroups.users.update` |
| people & status | group pane → Disable group → confirm → Disabled, gone from the default list | `usergroups.disable` |
| people & status | User Groups → Show disabled groups → a disabled group → Enable group | `usergroups.enable` |
| scheduling | composer send options → Tomorrow at 9:00 AM / Monday at 9:00 AM, or Custom time → date + time → Schedule Message; context bar above the composer | `chat.scheduleMessage` |
| scheduling | Drafts & sent → Scheduled (or the context bar's See all scheduled messages) | `chat.scheduledMessages.list` |
| scheduling | Drafts & sent → Scheduled → item More → Delete message → Delete | `chat.deleteScheduledMessage` |
| scheduling | message More actions → Remind me (after Mark unread) → In 20 minutes, In 1 hour, In 3 hours, Tomorrow, Next week or Custom… (date and time) → a reminder whose text is the message's permalink | `reminders.add`, `chat.getPermalink` |
| scheduling | Later → New reminder (+) or Create Reminder → what and when (a choice or Custom… date and time) → Create Reminder | `reminders.add` |
| scheduling | rail Later → In progress: open reminders, due soonest first, before saved messages; one about a message draws that message as the simulator has it and links to it; Completed: done reminders | `reminders.list` |
| scheduling | Later → a reminder → Mark complete → it moves to Completed | `reminders.complete` |
| scheduling | Later → a reminder → Delete | `reminders.delete` |
| search & navigation | sidebar Find a conversation… → matching channels, DMs and people → arrows + Enter or click opens it | `users.conversations` |
| search & navigation | top bar back / forward through visited conversations | — |
| search & navigation | message hover → Save for later (flips to Remove from Later); rail Later → /client/`<team>`/later | — |
| search & navigation | conversation header Star channel / Remove from Starred → Starred section in the sidebar; drag a sidebar row onto Starred | — |
| search & navigation | top bar Search → type → Enter → /client/`<team>`/search/search-`<query>`: Messages tab with its count, each match under its conversation with the query's words lit, N results, Previous/Next pages | `search.messages` |
| search & navigation | rail Activity (between DMs and Files) → the sidebar column lists mentions of the viewer, others' replies in the viewer's threads and reactions to the viewer's messages, newest first; filters All, Mentions, Threads, Reactions | `conversations.history`, `conversations.replies` |
| search & navigation | Activity → Mentions: messages and replies by others with <@viewer>, newest first | `conversations.history`, `conversations.replies` |
| search & navigation | Activity → Threads: others' replies in threads the viewer started, or replied in (after their first reply) | `conversations.replies` |
| search & navigation | Activity → Reactions: one item per reaction by someone else on the viewer's messages | `conversations.history`, `conversations.replies` |
| search & navigation | Activity item → the conversation scrolled to the message (lit and focused), or its thread pane for a reply; the sidebar stays on Activity with the item selected | `conversations.history`, `conversations.replies` |
| search & navigation | search results → Files tab with its count: each matching file by title, the query lit, its owner, date and type; a title opens the file viewer | `search.files` |
| search & navigation | a message result → its conversation scrolled to the message, lit and focused, or its thread pane for a reply | `search.messages`, `conversations.replies` |
| search & navigation | a query nothing matches → No results for “`<query>`”, with a tip | `search.messages` |
| search & navigation | typed in:, from:, has:, before: and after: go to the simulator as typed, and the results view shows what they select | `search.messages` |
| apps & views | a bot's message → Block Kit button (actions block or section accessory) → the app gets block_actions; a button's confirm dialog asks first | `blocks.actions` |
| apps & views | a button press the app doesn't ack (no app connected, no ack within 3 s, an error status) → Slack's generic error beside the button | `blocks.actions` |
| sidebar | sidebar section caret → collapse/expand Starred, Channels, Direct messages, Agents & apps; remembered per person | — |
| sidebar | sidebar top: Threads, Huddles, Drafts & sent, Directories (Directories opens the People directory) | — |
| sidebar | Direct messages lists your own DM ('you') first | `conversations.open` |
| sidebar | Direct messages sorted by most recent activity | `conversations.history` |
| sidebar | Agents & apps section lists DMs with bots, with app badge | `users.conversations` |
| sidebar | workspace name ▾ → menu: workspace name, switch person; other items disabled with reason | `team.info` |
| sidebar | DM row hover × closes the conversation | `conversations.close` |
| sidebar | rail DMs → list of every DM with last message and time | `users.conversations`, `conversations.history` |
| sidebar | top bar clock → recently visited conversations | — |
| sidebar | floating Unread mentions ↑/↓ pills scroll to badged rows off screen | — |
| sidebar | rail DMs button: count of DMs with unread messages | `users.conversations`, `conversations.info`, `conversations.history` |
| sidebar | count beside Drafts & sent, from the local drafts | — |
| sidebar | sidebar item right-click / More: Open channel details, Copy link, Star/Unstar, Leave or Close; Mute and Move to new section disabled with reason | — |
| sidebar | Agents & apps row opens the DM; its ↗ open-in-new-window renders disabled with reason | `users.conversations` |
| canvases & lists | a canvas at /client/`<team>`/canvases/`<id>` or in a channel's Canvas tab: headings, paragraphs, bulleted and numbered items, checklists, quotes, code, bold, italic, links and mentions | `canvases.getContent` |
| canvases & lists | a canvas's foot: Add to this canvas → type Markdown → Enter (insert_at_end) | `canvases.edit` |
| canvases & lists | hover a block → Edit → change its Markdown → Save: canvases.sections.lookup by its text, then replace that section, or the whole document when no single section matches | `canvases.sections.lookup`, `canvases.edit` |
| canvases & lists | hover a block → Delete: the section deleted, or the whole document rewritten without it when no single section matches | `canvases.sections.lookup`, `canvases.edit` |
| canvases & lists | a checklist item's box: tick or untick | `canvases.sections.lookup`, `canvases.edit` |
| canvases & lists | canvas ⋮ (More options) → Delete canvas → confirm, in the canvas view or the channel's canvas tab; a Canvases page row's ⋮ too | `canvases.delete` |
| canvases & lists | a List at /client/`<team>`/lists/`<id>` or in a channel's List tab: its title, the view toolbar, the table (a to-do List's Completed circle first, the primary column bold, select pills, people chips, date tags, checkboxes, subtask counts) | `slackLists.items.list`, `slackLists.items.info` |
| canvases & lists | a row's Open item, or its ⋮ → Open item → the Item panel over the table: the title, Mark Complete on a to-do List, every field with its control, the subtasks, and N of M with previous and next | `slackLists.items.info` |
| canvases & lists | + Add item → a new Untitled item with its title in edit → type → Enter commits it and starts the next (Escape stops) | `slackLists.items.create` |
| canvases & lists | a cell in the table or the Item panel: text (click, type, Enter), select and person (a picker), date (a date field), checkbox, and a to-do item's Completed circle or the panel's Mark Complete | `slackLists.items.update` |
| canvases & lists | a row's ⋯ → Delete item; or tick rows → Delete N items → confirm; a row's subtasks go with it | `slackLists.items.delete`, `slackLists.items.deleteMultiple` |
| canvases & lists | record panel → Add subtask → type → Enter (parent_item_id); the subtask shows in the panel and under its row | `slackLists.items.create` |
| canvases & lists | conversation tabs: one per List conversations.info names in properties.tabs, the List inside | `conversations.info`, `slackLists.items.list` |
| canvases & lists | List header ⋯ → Rename list → Save | `slackLists.update` |
| canvases & lists | the outline left of a canvas: a line per heading → the headings → one jumps to it | — |
| canvases & lists | List toolbar Search → type: the rows whose title matches; Escape clears | — |

**Gap**: the UI shows it, and it does not yet work as it does in the real service.

| Area | Feature | Why |
|---|---|---|
| conversations | conversation tabs: one per canvas conversations.info lists in properties.tabs, titled by the canvas → the canvas in the tab, with its outline and ⋮ | The simulator's conversations.canvases.create adds no canvas tab to conversations.info's properties.tabs, so a channel's canvas shows only in the page that made it. |
| people & status | Edit profile → Upload photo (multipart image) | The simulator's users.setPhoto refuses a multipart/form-data body with invalid_form_data and an image sent as text with no_image, while Slack takes the image as a multipart file, so the upload shows that error. |
| search & navigation | rail Files → the Files sidebar → Canvases: + New, a search box and All / Created by you / Shared with you over the viewer's canvases (files.list types=canvases), each opening its canvas, a row's ⋮ → Delete canvas | The simulator's files.list lists no canvas that canvases.create made, so the browser shows none. |
| apps & views | a button press → the app opens a modal → its title, blocks, text inputs, Cancel and Submit | Waits on the simulator: views.open does not yet take the trigger_id of a press, and the simulator does not yet tell a person's client that an app opened a modal for them. |
| apps & views | modal → Submit → views.submit with the text inputs' state; an empty or clear ack closes it, and an input left empty when required, malformed (email, URL, number) or outside its length or value limits says so under it first | Waits on the simulator: views.open does not yet take the trigger_id of a press, and the simulator does not yet tell a person's client that an app opened a modal for them. |
| apps & views | modal → Submit → an errors ack → each message under its input block, the modal open with what was typed | Waits on the simulator: views.open does not yet take the trigger_id of a press, and the simulator does not yet tell a person's client that an app opened a modal for them. |
| apps & views | modal → Submit → an update ack → the modal swaps to the ack's view, keeping what was typed into inputs it keeps | Waits on the simulator: views.open does not yet take the trigger_id of a press, and the simulator does not yet tell a person's client that an app opened a modal for them. |
| apps & views | modal → Submit the app doesn't ack → Slack's generic error at the top of the modal, the inputs as typed | Waits on the simulator: views.open does not yet take the trigger_id of a press, and the simulator does not yet tell a person's client that an app opened a modal for them. |
| sidebar | 'you' on your own DM, 'invited you' on a DM someone else opened | The simulator's conversations.info on an IM names no creator, as Slack's documented IM object names none, so the "invited you" suffix has nothing to read. |
| canvases & lists | the canvas view's header: the canvas's title | The simulator's files.info returns file_not_found for a canvas, so the header says its title can't be read. |
| canvases & lists | rail Files → the Files sidebar → Lists: + New, a search box and All / Created by you / Shared with you over the viewer's Lists (files.list types=lists), each opening its List | The simulator's files.list lists no List that slackLists.create made, so the browser shows none. |
| canvases & lists | List header ⋯ → Download as CSV | The simulator's slackLists.download.get returns a link the simulator doesn't serve, so the download says it's unavailable. |

**Out**: the UI leaves it out on purpose.

| Area | Feature | Why |
|---|---|---|
| shell | `api.test` | Connectivity check; no screen in the Slack client calls it. |
| shell | rail Agents & tools | Disabled, says why on click: the simulator serves no app, agent or workflow directory. |
| shell | rail Admin | Disabled, says why on click: needs admin.*, which the simulator doesn't serve. |
| shell | rail foot moon: Turn on focus mode | Disabled, says why on click: the simulator models no focus mode (no users.prefs or dnd.setSnooze). Real Slack's moon is focus mode, not a theme switch. |
| shell | top bar: Chat with Slackbot AI, right of Search | Disabled, says why on click: the simulator serves no Slack AI. |
| shell | top bar: Help (?) at the right end | Disabled, says why on click: Slack's help center and feedback aren't part of the simulator. |
| shell | rail foot Create new (+) → Huddle | Disabled, says why on click: the simulator serves no huddle API. |
| shell | rail foot Create new (+) → Workflow | Disabled, says why on click: the simulator serves no workflows. |
| shell | rail foot Create new (+) → Invite people | Disabled, says why on click: needs admin.users.invite, which the simulator doesn't serve. |
| messages | `chat.postEphemeral` | No client control sends one; showing a received one needs a client delivery the simulator keeps on the control plane. |
| messages | `chat.startStream` | Bot token only; the client never starts a stream, and renders a streamed message as any other. |
| messages | `chat.appendStream` | Bot token only; no client control. |
| messages | `chat.stopStream` | Bot token only; no client control. |
| messages | composer toolbar: More options (…), after Mention someone | Disabled, says why on click: shortcuts and workflows come from apps, which the simulator doesn't serve. |
| messages | message hover → Forward message…, between Reply in thread and Save for later | Disabled, says why on click: Slack forwards through a client method the Web API doesn't publish; chat.postMessage with a permalink would post a different message than a forward. |
| reactions | `reactions.list` | No Slack client screen lists the items a person reacted to. |
| threads | thread pane header: Summarize thread | Disabled, says why on click: the simulator serves no Slack AI. |
| threads | thread pane header ⋮ → Get notified about new replies | Disabled, says why on click: needs subscriptions.thread.*, which the simulator doesn't serve. |
| threads | thread pane header ⋮ → Mark unread | Disabled, says why on click: a thread's read mark needs subscriptions.thread.*, which the simulator doesn't serve; conversations.mark would move the channel's read mark instead. |
| conversations | channel header: Start huddle (headphones) and More Huddles options (chevron) | Disabled, says why on click: the simulator serves no huddle API. |
| conversations | channel header bell (Edit notifications) and header ⋮ → Edit notifications | Disabled, says why on click: needs users.prefs, which the simulator doesn't serve. |
| conversations | channel header ⋮ → Open in new window | Disabled, says why on click: this client is a single window. |
| conversations | conversation tabs: + → File, canvas, or list (New) | Disabled, says why on click: Slack adds the tab with conversations.addTab, which the simulator doesn't serve. |
| conversations | conversation tabs: + → Workflow | Disabled, says why on click: the simulator serves no workflows. |
| conversations | conversation tabs: + → Folder | Disabled, says why on click: bookmark folders aren't part of the simulator. |
| conversations | conversation tabs: + → Add template to channel | Disabled, says why on click: the simulator serves no channel templates. |
| conversations | conversation tabs: + → Edit tabs | Disabled, says why on click: no write reorders or removes a channel's tabs. |
| files | `upload/v1/{ticket} (PUT)` | The client POSTs the bytes; PUT is the same upload over another verb. |
| files | rail Files → the Files sidebar → Deleted | Disabled, says why on click: the simulator serves no read of deleted canvases and Lists. |
| files | rail Files → the Files sidebar → Starred | Disabled, says why on click: needs stars.list, which the simulator doesn't serve. |
| files | rail Files → the Files sidebar's More options | Disabled, says why on click: the Files sidebar's settings aren't part of the simulator. |
| files | the Canvases and Lists pages' Templates row and See all | Not drawn: the simulator serves no canvas or List templates. |
| people & status | `users.identity` | Sign in with Slack identity endpoint; the client has no screen for it. |
| scheduling | `reminders.info` | Later draws each reminder from reminders.list; no screen reads one reminder alone. |
| search & navigation | Later → Archived tab | Disabled, says why on click: archiving a Later item is Slack's saved.* state, which the simulator doesn't serve. |
| search & navigation | Later header → Filter | Disabled, says why on click: Later's filters read Slack's saved.* state, which the simulator doesn't serve. |
| search & navigation | Huddles | No huddle API in the simulator. |
| search & navigation | `search.all` | The results view asks search.messages and search.files, one per tab, so each tab pages on its own; search.all returns the same two lists and no other screen needs it. |
| apps & views | `views.publish` | Bot write; the simulator exposes no read or event a client could render App Home from. |
| apps & views | `views.update` | Bot write; same as views.open. |
| apps & views | a message's selects, overflow menus and date pickers | Drawn disabled: the simulator's blocks.actions presses buttons only. |
| apps & views | a modal's selects, date pickers, checkboxes and radio buttons | Drawn disabled: this client draws only a modal's text inputs so far. |
| apps & views | a button inside a modal | Drawn disabled: the simulator's blocks.actions presses a message's buttons, not a modal's. |
| apps & views | a push ack → the pushed view over the open one, with Back | The simulator serves no views.push and mints no view for a pushed one, so the client could not submit it; a push ack closes the modal. |
| apps & views | closing a modal whose view sets notify_on_close → the app gets view_closed | The simulator delivers no view_closed, so closing a modal tells the app nothing. |
| apps & views | a modal input whose conversation picker sets response_url_enabled → response_urls in the submission | The simulator's view_submission always carries an empty response_urls. |
| sidebar | Invite people / Connect apps | Needs admin.*, which the simulator doesn't serve; renders disabled. |
| sidebar | sidebar gear (Manage my sidebar) | Needs users.prefs, which the simulator doesn't serve; renders disabled. |
| sidebar | Welcome back / onboarding banners | No backing data in the simulator. |
| sidebar | sidebar item menu → Mute | Needs users.prefs, which the simulator doesn't serve; renders disabled. |
| sidebar | Create a section / Move to new section | Slack keeps sections in prefs the simulator doesn't serve; Move to new section renders disabled. |
| sidebar | section options: show unreads only, sort | Show unreads only / sort need users.prefs; not rendered. |
| canvases & lists | List toolbar All items ▾ | Disabled, says why on click: the simulator serves no List views. |
| canvases & lists | List toolbar Edit view | Disabled, says why on click: the simulator serves no List views. |
| canvases & lists | Item panel → Add Comment | Disabled, says why on click: comments on an item aren't part of the simulator. |
| canvases & lists | a standalone List's header Share, Workflows and the info button | Not drawn: the dialogs they open in Slack are not known yet, apart from a channel's Share this list?, reached through conversations.addTab. |

<!-- END generated: ui-features -->

---

Source: https://www.rystic.ai/docs/simulators/slack/features/verified-ui-support · Markdown: https://www.rystic.ai/docs/simulators/slack/features/verified-ui-support.md
