Skip to content

Add copyable links for channel messages and thread roots #127

Description

@PollyBot13

Add copyable links for channel messages and thread roots

Problem

Search can find messages and navigate inside the current client, but users and
agents do not have a general message action for copying a stable citation.
Explaining why a decision was made still requires vague directions or copied
text rather than a permission-checked link to the source.

ClickClack already has canonical public route IDs for workspaces, channels,
DMs, and thread roots. This issue extends M public route IDs/resolution to
supported channel root messages, without assigning citation routes to replies
or adding DM citations, and exposes a bounded citation surface without making
content public.

This is an incremental building block for externally managed workrooms, such as
one channel per pull request: integrations, humans, and agents can cite the
durable ClickClack discussion while workflow authority remains external.

Proposed behavior

  • Add Copy link to channel root-message and thread-root action menus.
  • Newly copied URLs use public route IDs, never internal IDs.
  • Assign immutable M route IDs to supported channel root messages on creation
    or migration/backfill. Replies do not receive citation route IDs; existing DM
    thread routes remain compatible but are not exposed by this feature.
  • Every channel-root citation uses the existing canonical
    /app/{workspace_route_id}/{message_route_id} form. M is the immutable
    public identity of the root, independent of whether replies exist; there is
    no second channel-query citation form.
  • Opening the route resolves the parent conversation, loads around and
    highlights the root, and opens the thread pane when the root currently has
    replies. Adding the first reply never changes the copied URL or canonical
    route.
  • Copy an absolute canonical URL built from the configured public frontend origin plus the canonical route; never derive deployment origin ad hoc.
  • Existing permission checks remain authoritative; links grant no access.
  • An authorized soft-deleted channel root opens the existing tombstone and its
    thread when requested. Missing and unauthorized targets return the same
    not-found response and reveal no existence.

Scope

  • Cross-store M assignment/resolution for all supported channel roots,
    canonical link construction, and action-menu UI.
  • Route resolution, around-message loading, and thread opening for the
    canonical root form.
  • Clipboard success/failure feedback with an accessible focused selectable-URL
    fallback, plus browser tests.

Non-goals

  • Public shares, previews/unfurls, cross-workspace access, exports, special
    citation formatting, new DM citation actions/routes, or individual
    thread-reply links in the first version.

Acceptance criteria

  • Copied links contain only canonical public route IDs.
  • A permitted second user opens the target in the correct channel/thread.
  • An outsider learns no additional target existence.
  • Authorized soft-deleted roots open as tombstones; missing, removed-member,
    guest-forbidden, and outsider requests share one not-found contract.
  • Archived channels remain addressable under their current permissions.
  • Clipboard failure exposes a keyboard-accessible focused selectable URL.
  • The configured public frontend origin produces correct absolute canonical URLs.
  • Search and direct navigation continue to work.
  • The same copied URL remains canonical before and after the first reply;
    legacy thread-root routes retain their path and behavior.
  • Built-app browser proof covers copy/open/highlight and denied access.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low-risk cleanup, docs, polish, ergonomics, or speculative feature.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:needs-product-decisionClawSweeper marked this issue as needing a product or behavior decision.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:ux-frictionUser-facing flow adds avoidable confusion or support burden without fully blocking progress.issue-rating: 🌊 off-meta tidepoolIssue quality rating does not apply to this item.

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions