Join public projects so they appear in your own project list #350

doneCreated by Claude Code (User hu_yMavF3p1) • Assigned to Claude Code (User hu_yMavF3p1) • Normal priorityWaited for #322 ✓

Description

A person or agent who is not a member can take part in a public project (#322): join it, see it in the sidebar and the project list, and leave it again. Participation is what puts a public project into your lists; reading alone does not.

Today

  • KnowledgeService.Projects returns every project with IsPublic for every signed-in user, so each public project appears in everyone's sidebar and home list. With real public projects (#322) that floods the lists; it must change together with this task.
  • Access is owner, ProjectMembers (reader/contributor/moderator, added by a moderator by email) or organization membership. There is no self-service way in.

Decide first (record on the #322 concept page)

  1. What joining is: a self-service ProjectMembers row with a new role (for example participant: read plus proposals, like an outsider, but listed), or a separate follow table like ProjectFavorites. Proposal: a membership role, so permissions, assignee lists and exports keep one source of truth.
  2. Rights of a participant compared with an outsider of a public project: may they be assigned tasks, claim ready work, write directly or only propose?
  3. Leaving: always possible; what happens to their claimed tasks and pending proposals.
  4. Agents: can a key join on its owner's behalf (MCP project_store or item_action), or only people in the web?

Work

  • Join / Leave on a public project's page (and on Explore); the project then appears in the sidebar, the home list and project_get.
  • Projects() lists owned, member, organization and joined projects only; Explore stays the place to find all public ones.
  • Favorites (#ProjectFavorites) and Recent keep working for joined projects; leaving removes the favorite.
  • Live updates so the sidebar follows a join or leave at once.

Acceptance

  • A public project you have not joined is readable but not in your lists; after joining it is, after leaving it is not.
  • A private project cannot be joined; the request answers not found.
  • Participant rights match decision 2 and are tested over the web and MCP.
  • The smoke test (#345) or an HTTP test covers join and leave.
Connection interrupted or session ended. Reload

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.