Public projects like GitHub: private by default, public readable by everyone #322
Description
A project is private or public, as on GitHub. Private: owner, members and the organization read and write. Public: everyone in the world reads everything shared, without an account; writing stays with members, outsiders propose.
Today
Project.IsPublicexists, but only as "Enable public contributions" in the project settings, and only with a verified remote. Semantics: signed-in non-members may read and may createpublicmemories that go to review.- Every web page carries
[Authorize], including Explore. Nobody reads anything without an account. - MCP:
project_createandproject_updatehave no public flag;project_listdoes not report it. A key of a non-member reaches a public project only through the memory visibility rules. - Memory visibility
publicis tied toIsPublic(#321 replaces it withshared).
Decide first, record on #309 or a concept page
- Verified remote as a precondition? GitHub needs none. Proposal: public needs no remote; a verified remote only marks the repository link as verified.
- What outsiders see: shared memories, tasks, pages, instructions, history and proposals. Private memories stay with their author. Assignee and agent display names become visible; state this in the confirmation.
- Search engines:
noindexby default with an opt-in per project, or indexed like GitHub. - Making a project private again: outsider proposals pending at that moment, forks that recall the upstream (#309: upstream recall takes
sharedmemories of a public upstream), and outsiders' bookmarks. Proposal: pending outsider proposals stay decidable, forks stop receiving upstream recall, links return "not found" as for any private project. - Confirmation before going public: a dialog naming what becomes visible and reminding of the guide rule that credentials, account names, security details and legal matters do not belong in a project that may become public. Owner only, not moderators.
Work
- Web: anonymous read of public projects (Explore, project page, memories, tasks, docs, item pages, history) with every action hidden; sign-in prompt where an action would need it. Rate limiting for anonymous reads.
- MCP:
project_getreportspublic;project_storetakespublic(owner only); any key reads a public project and its shared items; a write from a non-member becomes a proposal, not a refusal.recallon a public project works for any key. - Live updates (
LiveUpdatePoller) respect the same rule for anonymous viewers. - Explore lists public projects for everyone; the project's public badge and the memory hint from #321 ("shared is visible to everyone in a public project") are shown.
- Setting: "Private" / "Public" with the confirmation from decision 5; the remote precondition removed or kept per decision 1.
- Guide and server instructions: what public means for stored content, in one sentence.
Acceptance
- Signed out, a public project's shared memories, tasks, pages, instructions and their history are readable in the web; a private project returns not found. Both tested.
- A key without membership reads a public project over MCP, and its store becomes a proposal; on a private project it gets not found. Tested.
- Private memories of a public project are never visible to anyone but their author, signed in or out. Isolation tests extended.
- Switching public to private hides everything from outsiders at once; pending outsider proposals remain in moderation.
- The confirmation dialog appears before a project goes public and names what becomes visible.
- No member email address is visible to anyone outside the project.