Skip to content

Commit 0484829

Browse files
committed
docs(channels): scope the public-channel UX model
Channels are readable in full detail by every org/project user; joining is participation (feed, start threads, post), not access control; only the personal #me channel is private. Reframe workstream A's membership accordingly, extend E's live-transcript visibility to project users, and align G's MCP search scope and auth tiers (project read, member write, owner-gated steering). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CbhUuXuEy319snoLL3KSya
1 parent d13fe49 commit 0484829

1 file changed

Lines changed: 27 additions & 11 deletions

File tree

docs/plans/channels-architecture.md

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ The framing we're building toward:
2424
PRs, canvases and generated UI HTML, pasted images, plans, files — in a
2525
real data model, so it can be surfaced later in the UI or attached to new
2626
work as a context piece.
27+
- **Channels are public to all org/project users.** Anyone in the project
28+
can open any channel and see what's going on in full detail — threads,
29+
transcripts, artifacts, context. **Joining** a channel makes you a
30+
participant: you get its feed and can interact (start threads, post),
31+
with limits on steering existing tasks (deferred; see below). Only the
32+
personal `#me` channel is private.
2733
- **The thread creator steers.** Others can request to steer; the owner
2834
accepts or denies per user.
2935
- **MCP can pull in all of the above.** The whole channel and its threads are
@@ -136,9 +142,15 @@ One channel identity that owns feed, context, artifacts, and membership.
136142
- Introduce `packages/core/src/channels/` as a real feature (service, store,
137143
schemas) instead of channel logic living inside `canvas/`. Move
138144
`channelTasksService`, `channelName`, channel-link wiring there.
139-
- Add membership (member list, join/leave, personal vs public vs private) to
140-
the canonical row — prerequisite for steering grants, mentions, and MCP
141-
auth.
145+
- Add membership to the canonical row as **participation, not access
146+
control**: every non-`personal` channel is project-public — any project
147+
user can browse it in full detail without joining. Joining (join/leave,
148+
member list) subscribes you to the channel's feed/mentions/notifications
149+
and is the write-side gate: members start threads and post to them.
150+
Steering *existing* threads stays owner-gated regardless of membership —
151+
the accept/deny grant flow is E, deliberately later. `channel_type`
152+
already distinguishes `public | personal`; do not build private team
153+
channels or ACLs in v1, just leave the enum room.
142154
- Exit criteria: one channel id in deep links, task rows, artifact parents,
143155
and the feed; `domain-types.ts` no longer needs the "distinct from the
144156
desktop file-system channel folders" disclaimer.
@@ -237,9 +249,11 @@ teammates can actually watch.
237249
command endpoint enforces. Cloud runs already have the command surface
238250
(`user_message` via `/command/`); the backend gains an authorization check
239251
beyond "task author".
240-
- **Shared visibility (L–XL):** teammates need to see the live transcript.
241-
Cloud runs: extend `stream_token` issuance to channel members (read-only) —
242-
mostly backend auth work, the SSE pipe exists. Local runs are the hard
252+
- **Shared visibility (L–XL):** teammates need to see the live transcript —
253+
and since channels are project-public, read access follows the channel:
254+
any project user, member or not, can watch. Cloud runs: extend
255+
`stream_token` issuance to project users (read-only) — mostly backend
256+
auth work, the SSE pipe exists. Local runs are the hard
243257
case: either relay local session events up to the cloud feed (making the
244258
local/cloud transcript residency symmetric), or scope v1 to "shared threads
245259
run in the cloud" and make that a product stance. Recommendation: take the
@@ -278,9 +292,10 @@ find the right context without slurping everything.
278292
through raw feeds. Two grains:
279293
- `search_channel(channel, query)` — threads, messages, transcripts,
280294
artifacts, and context versions within one channel;
281-
- `search_channels(query)` — cross-channel, membership-scoped, returning
282-
channel + thread hits ranked so the caller can drill in with one more
283-
call.
295+
- `search_channels(query)` — cross-channel, project-scoped (channels are
296+
project-public; only `personal` channels are excluded for non-owners),
297+
returning channel + thread hits ranked so the caller can drill in with
298+
one more call.
284299
This needs a server-side index over thread titles/messages/summaries and
285300
context versions. Full-transcript indexing is expensive; index the
286301
per-thread summaries C already produces, with transcript fetch as the
@@ -292,8 +307,9 @@ find the right context without slurping everything.
292307
follow-on, local threads surface via MCP as metadata + summary only —
293308
another reason for the "shared threads run in the cloud" stance.
294309
- The PostHog MCP server already fronts `desktop-file-system`; the new
295-
plumbing is the search index and transcript read path, plus auth (channel
296-
membership from A).
310+
plumbing is the search index and transcript read path, plus auth mirroring
311+
the UX model: project access grants reads, channel membership (from A)
312+
gates writes, steering rules (E) gate posting into existing threads.
297313
- Depends on A + B; C feeds the index; D and E make it much more useful.
298314

299315
### H. Channel creation, organization, and automations-in-channels (M)

0 commit comments

Comments
 (0)