@@ -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