Read a file from a public repository, without a credential and without a mount #679

Closed
opened 2026-08-13 18:35:36 +00:00 by coilyco-ops · 0 comments
Member

Filed by Angie (ENG, claude seat) as the capability half of #633, so a tool does not close a ticket that asks for a mount layout.

633's stated need is its first line:

sirens-deep currently has no repository content access ... the agent cannot inspect its own source even though the repo is public

Its third acceptance criterion is "read access to repo contents, not just issues". That is satisfiable today with no infrastructure, and this issue is that slice. 633 keeps the mount question, which is a different size and belongs to deploy.

Why not the mount, for this need

A mount is a clone at pod start, a volume, and a permanent question about what re-syncs it. A mounted clone is stale the moment anything merges, which for this repository today is several times an hour, so an agent reading its own source from a mount would frequently be reading yesterday's.

An API read is current by construction.

Why no credential

The same reason list_public_repos needs none: public content is public. The issue-only Forgejo grants 633 describes are not a constraint on an unauthenticated read.

Holding no token is the guarantee, rather than a visibility filter. A filter is a line of code that can be regressed; no credential cannot see a private repository at all.

Shape

read_public_file, sibling to list_public_repos. Owner, repo, path, optional ref. Bounded output like the fetch tool, since a source file can be arbitrarily large and a tool result cannot.

Off unless the deployment configures the forge, the posture fetch, the scratchpad and the inventory all take.

Acceptance

  • A public file is returned by owner, repo and path, at a named ref or the default branch.
  • No Authorization header is sent, asserted rather than assumed.
  • A file larger than the bound is truncated with the loss stated, not silently cut.
  • A path that escapes the repository is refused.
  • Unconfigured offers no tool.

Not in scope

The mount, both of 633's first two criteria, and anything that writes.

**Filed by Angie (ENG, claude seat) as the capability half of https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/633**, so a tool does not close a ticket that asks for a mount layout. 633's stated need is its first line: > sirens-deep currently has no repository content access ... the agent cannot inspect its own source even though the repo is public Its third acceptance criterion is *"read access to repo contents, not just issues"*. **That is satisfiable today with no infrastructure**, and this issue is that slice. 633 keeps the mount question, which is a different size and belongs to deploy. ## Why not the mount, for this need A mount is a clone at pod start, a volume, and a permanent question about what re-syncs it. **A mounted clone is stale the moment anything merges**, which for this repository today is several times an hour, so an agent reading its own source from a mount would frequently be reading yesterday's. An API read is current by construction. ## Why no credential The same reason `list_public_repos` needs none: public content is public. The issue-only Forgejo grants 633 describes are not a constraint on an unauthenticated read. **Holding no token is the guarantee**, rather than a visibility filter. A filter is a line of code that can be regressed; no credential cannot see a private repository at all. ## Shape `read_public_file`, sibling to `list_public_repos`. Owner, repo, path, optional ref. Bounded output like the fetch tool, since a source file can be arbitrarily large and a tool result cannot. Off unless the deployment configures the forge, the posture fetch, the scratchpad and the inventory all take. ## Acceptance - A public file is returned by owner, repo and path, at a named ref or the default branch. - No `Authorization` header is sent, asserted rather than assumed. - A file larger than the bound is truncated with the loss stated, not silently cut. - A path that escapes the repository is refused. - Unconfigured offers no tool. ## Not in scope The mount, both of 633's first two criteria, and anything that writes.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-gaming/sirens-echo#679
No description provided.