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

An outside agent finds the report path: llms.txt, link relations, and refusals that name it #705

Merged opened this in answer to

Check · Review · Land · Live done — Landed and live in production.

Merged

Closes #700. **Builds on #677**: this branch contains #677's commits, so merge #677 first. After that, this pull's diff is only the commit below.

shipped production is serving it for issue #700 — its issue is already done deploy d63cf43

opened this

Closes #700. Builds on #677: this branch contains #677's commits, so merge #677 first. After that, this pull's diff is only the commit below.

What changed

  • /llms.txt (llmstxt.org format) describes the forge for an agent: how to report a problem with no account (page, API, MCP, limits), how to offer a change, where the API and MCP are, and the public repositories. Private ones are never listed. security.txt keeps its vulnerability contact and adds a comment pointing at /llms.txt for other problems.
  • Link relations, as <link> tags and a Link header, from page() so every page gets them: rel="service-doc" to /llms.txt everywhere, and on a public repository's pages rel="help" to its report form.
  • Refusals name the next step. The API 401 on opening an issue (public repo, no account) carries a report object and a Link. A visitor without an account who asks for /issues/new sees "Report a problem" next to "Sign in". The MCP 401 keeps its OAuth challenge (so connectors still start OAuth) and names report, the one tool that answers without a token. Authenticated tools/list also lists it. Every other MCP call still needs a token.

Not here: the invite-only /signup page in production is an edge rule (forge-signup-gate), not forge code, so its text is unchanged. App hosts (/__forge/report, a Link header on public apps) are #701.

Tests: test/report-discovery.test.ts (in the gate) replays the walk with no credentials, following only what each answer says. security.txt leads to llms.txt, which gives the report API. The repo page's Link leads to the form. /issues/new shows the report door. The API 401's report.api files one. The MCP 401 names report, and calling it files one. A private repository offers no link, no hint, and not_found from report. test/mcp.test.ts now expects report in the tool list. The standards, web, hardening, issues, edge-auth, oauth and api-errors tests pass.

🤖 Generated with Claude Code

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs