Public: anyone can read this; the crew can change it.

Every repository and app page says who can see it in a sentence that names the people, and the API and MCP say the same #809

Closed opened this has it
opened this

Pillar: P0 Trust (umbrella #586). One run, started fresh from today's main.

Intent. Every repository and app page says who can see it, in plain words that name the people: the Private/Public badge becomes a sentence.

Today. src/web/chrome.ts (repo head, ~line 278) shows a bare Private / Public badge. The only plain wording is in form hints: the new-repository form (src/web/pages/site.ts:928), app access (src/web/pages/apps.ts:341) and settings (src/web/pages/settings.ts:432). A person on the page itself cannot tell whether "private" means them alone, their organization, or also the crew.

Acceptance.

  • [ ] One pure function, audienceOf(facts) → { level, sentence } in a new module src/core/audience.ts. It takes plain data (visibility, owner kind, writer and reader counts, whether the crew works here, app access) and returns a sentence. Examples: "Private: only you and the crew." / "Private: you, 3 people in acme, and the crew." / "Public: anyone on the internet can read this; 2 people can change it." Counts come from the same rules as REPO_VISIBLE / REPO_WRITABLE in src/core/visibility.ts, so the sentence cannot disagree with what is enforced.
  • [ ] The repo head in src/web/chrome.ts keeps its badge and shows the sentence beside it, as a link to the repository's settings for writers and as plain text for readers. It must not shift layout: one line, truncated with the full text in title.
  • [ ] The app page (src/web/studio/app.ts) says the same for the app, including the case from #620: a private app on a public repository reads "The code is public; the app answers only to …".
  • [ ] GET /api/v1/repos/:owner/:name returns audience: { level, sentence }, and the MCP tool that describes a repository returns the same field in the same words. One words source, no second copy.
  • [ ] Nothing is counted that the viewer may not see: a reader is told "people who can write" as a number, never their names, and private org members are never listed.
  • [ ] Tests (test/audience.test.ts): each sentence for private/personal, private/org, public, a private app on a public repo; and the count matches the access rule for a seeded org with a reader, a writer and an outsider.

Done means reachable: the page (repo head and app page), the MCP (the repository tool's audience), a test, and a look at a private and a public repository on phone and desk.

Files I expect to change: src/core/audience.ts (new), src/web/chrome.ts, src/web/studio/app.ts, src/http/api.ts, src/http/mcp.ts, test/audience.test.ts, and docs/MCP.md for the new field.

Risks. A wrong count is worse than none: it tells someone their work is safer than it is. Compute from the enforced rule, not from a parallel query. Counting must stay cheap on the repo head (one indexed query); the page should still answer in under 50 ms.

Suggested brief: a builder with the trust brief (sentinel to review).

Must not touch: the release workflow, the chart (charts/), other repositories.

commented

Parked by the crew: the check failed ("capacity: only a forge admin reads or changes it > an admin changes each one from the page, the API and MCP; a wrong value is refused; every change is kept") and the decider saw no point in another try (pull #977 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.

commented

State: split into #2566, #2567, #2568 and #2569. It reached its run cap because one run had to write a new module and change two pages, the API and the MCP. What the fresh ones do differently: #2566 is only the pure audienceOf function and its tests, and the head (#2567), the app page (#2568) and the API with MCP (#2569) each follow it as their own run, in parallel. My close was refused (403), so this waits on the three surfaces. A person can close it as split into them.

commented

State: done, every piece landed: #2583 (363d3ce9, audienceOf), #2567 (91bb593c, the repository head), #2568 (56c080d1, the app page) and #2569 (bc8faa21, the API and MCP). Nothing is left. It reached its run cap only because builders were handed finished work. My token cannot close it, because it came as run-capped, not as a hand-over. A person can close it as split into [2583, 2567, 2568, 2569].

commented

Steward (trevato): split into #2583, #2567, #2568, #2569, all closed as done (checked).

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs