Public: anyone can read this; the crew can change it.
An outsider can report a problem or offer a change on a public app or repository without being taught #605
Added acceptance (owner's contract rule, now in the direction and docs/VISION.md):
- [ ] Contract: one interface per job. If this screen or control does a job another one already does, keep the better and delete the other in this same pull.
- [ ] Minimal, not bare: every element earns its place on the path below; white space at every width; nothing shown the person does not need now.
- [ ] One primary next action on the screen, and the pull's looks show the path below at phone and desktop widths.
- [ ] The pull says what it removes for every screen or control it adds.
The path: an outsider (person or agent) lands on a public app or repository page and hit a problem; the one action is Report a problem; they leave with an issue number.
Sharpened before a run starts (from tracing the Muse failure, 2026-10-05). This comment is part of the brief.
What an outside agent meets today on cheffryjames/cheffry-s-dungeon (app at game.cheffryjames.com), anonymous:
| step | request | answer | what it needed |
|---|---|---|---|
| 1 | GET game.cheffryjames.com/ | 200; OG tags; no link to the repository, no report link; only "sign in" | a link to the source and to "report a problem" |
| 2 | GET /llms.txt, /.well-known/* on the app host | 404, except security.txt → 302 to the forge's, whose Contact is a profile page | a machine-readable "how to report / how to offer a change" |
| 3 | GET forge…/cheffryjames/cheffry-s-dungeon | 200; generic description "Your code, your machine."; no <link rel> for the repo | per-repo description and links |
| 4 | GET …/issues/new | 303 → /_plat/login → Forgejo sign-in | an anonymous report path |
| 5 | POST /api/v1/repos/…/issues | 401 authenticate with a bearer token or account credentials; no WWW-Authenticate, no next step | an error that names the report path |
| 6 | POST /mcp initialize | 401 with a correct WWW-Authenticate + resource metadata (good) | an MCP tool open to anonymous, or the report route in the error |
| 7 | GET /signup | 403 "invite-only, ask the owner" | the same report path, linked |
Added acceptance (all required):
- [ ] Literal replay test, in the pull and in the gate: run steps 1-7 above against a public app and its repo with no credentials; the sequence ends with a report visible on that repo. No account, no human help.
- [ ] Generic agent test, in the pull: a browsing agent given only the app's URL ("this game is down; tell its makers") files a report. Record what it followed.
- [ ] Standards, not prose. The app page (served through the forge edge, so every public app gets it without code changes) and the repo page carry
<link rel="help">-style relations plus an HTTPLink:header pointing at the report document;/llms.txtand/.well-known/on the forge and on app hosts describe, in a few lines of machine-readable text, "report a problem" (method, URL, fields, limits) and "offer a change". Use existing conventions (Linkheader,llms.txt, security.txtContact:pointing at the report URL rather than a profile); invent nothing a stranger would not look for. - [ ] Errors carry the next step. The 401 on
POST …/issues, the 303 on/issues/new, the 403 on/signup, and the MCP 401 each name the anonymous report route (JSON field +Linkheader for API/MCP; a visible link for pages).
Safety (security is the owner's top priority; outsider text recently reached the crew and that hole was closed):
- [ ] An outsider report is text only (no attachments, no markdown that renders links or images live), title and body size-capped, rate-limited per source, honeypot, and stored marked untrusted.
- [ ] It is shown everywhere as "from outside" and is not an issue the crew can see: it never enters dispatch, a brief, a comment thread an agent reads, or the MCP for agent tokens, and starts no run, until a person with write access accepts it. Accepting turns it into an ordinary issue authored by that person, quoting the outside text. Test this: a report on a repo with autonomy on starts nothing and appears in no brief.
- [ ] No account is created as a side effect. No email or address shown publicly. Private repos and private apps answer
not_foundexactly as today. - [ ] Nothing in this issue's pull or docs describes how to abuse the path.
Done means reachable: page (the links on public app and repo pages, the accept button for the owner), API + MCP (report {repo, title, body, page?} open to anonymous), the two tests above, and a look (the game's page and the repo's page showing the links, plus the owner's view of a pending outside report).
Pillar: P5 Open to agents (umbrella #591). One run, started fresh from today's
main.Outcome (what a person sees). On a public app or repository, a stranger (a person or an agent) sees how to report a problem and how to offer a change, and can do it.
Today. The fork-and-propose flow exists (src/actions/contribute.ts). Filing an issue needs an account and a write path; nothing says how to an outsider.
Acceptance.
not_foundexactly as today.Done means reachable (all four, or the pull says which one does not apply and why):
report {repo, title, body, page?}Start from: src/actions/issues.ts, src/actions/contribute.ts, src/core/ratelimit.ts, src/web/pages/repo.ts, src/web/pages/apps-name.ts, src/http/api.ts, src/http/mcp.ts.
Must not touch: the release workflow, the chart (charts/), other repositories. Do not loosen any access check.