Join public projects so they appear in your own project list #350
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.Projectsreturns every project withIsPublicfor 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)
- What joining is: a self-service
ProjectMembersrow with a new role (for exampleparticipant: read plus proposals, like an outsider, but listed), or a separate follow table likeProjectFavorites. Proposal: a membership role, so permissions, assignee lists and exports keep one source of truth. - 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?
- Leaving: always possible; what happens to their claimed tasks and pending proposals.
- Agents: can a key join on its owner's behalf (MCP
project_storeoritem_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.