Found at bring-up: nisse-review started "reading no repositories". Gitea's /user/repos leaves out a public repository's Read collaborators, so dev/nisse never appeared, even after nisse-review was added as a Read collaborator. Settled with the operator: option (a), the configuration decides for public repositories.
Changes
repositories holds patterns:dev/nisse, dev/*, */*. They're matched against every repository the account can read, public ones included: an organization's (or user's) list for owner/*, Gitea's search for */*. Unset, it uses /user/repos as before. A configured repository it can't read is left out, with an access.unreadable oplog line; an unknown owner gets access.no_owner. Patterns that aren't owner/name are config errors.
The read-only wall (R3) is checked every round, not only at startup. If push or admin is granted while it runs, the scheduler raises AccessRefused and nisse-review exits 3 instead of reviewing on.
nisse-core GiteaClient:GiteaNotFound (a GiteaError) for 404s, owner_repositories(owner) (/orgs/…/repos, then /users/…/repos) and visible_repositories() (/repos/search).
Docs: R1 and R3 in the architecture, the M7.3 notes in the plan, and the example config.
Tests
Patterns reach public repositories missing from /user/repos, and a round picks up only the matching ones.
An unreadable configured repository and an unknown owner are left out and logged.
Write access granted mid-run stops the round, with nothing reviewed.
Pattern validation in the config.
Gitea: the org-then-user fallback, the search listing, and a 404 raising GiteaNotFound.
Mutant: dropping the per-round check fails the mid-run test.
After merge, I'll restart the bring-up with repositories: ["dev/*"].
Found at bring-up: nisse-review started "reading no repositories". Gitea's `/user/repos` leaves out a public repository's Read collaborators, so `dev/nisse` never appeared, even after `nisse-review` was added as a Read collaborator. Settled with the operator: option (a), the configuration decides for public repositories.
**Changes**
- **`repositories` holds patterns:** `dev/nisse`, `dev/*`, `*/*`. They're matched against every repository the account can read, public ones included: an organization's (or user's) list for `owner/*`, Gitea's search for `*/*`. Unset, it uses `/user/repos` as before. A configured repository it can't read is left out, with an `access.unreadable` oplog line; an unknown owner gets `access.no_owner`. Patterns that aren't `owner/name` are config errors.
- **The read-only wall (R3) is checked every round,** not only at startup. If push or admin is granted while it runs, the scheduler raises `AccessRefused` and nisse-review exits 3 instead of reviewing on.
- **nisse-core `GiteaClient`:** `GiteaNotFound` (a `GiteaError`) for 404s, `owner_repositories(owner)` (`/orgs/…/repos`, then `/users/…/repos`) and `visible_repositories()` (`/repos/search`).
- **Docs:** R1 and R3 in the architecture, the M7.3 notes in the plan, and the example config.
**Tests**
- Patterns reach public repositories missing from `/user/repos`, and a round picks up only the matching ones.
- An unreadable configured repository and an unknown owner are left out and logged.
- Write access granted mid-run stops the round, with nothing reviewed.
- Pattern validation in the config.
- Gitea: the org-then-user fallback, the search listing, and a 404 raising `GiteaNotFound`.
- Mutant: dropping the per-round check fails the mid-run test.
After merge, I'll restart the bring-up with `repositories: ["dev/*"]`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
At bring-up, nisse-review read no repositories: Gitea's /user/repos leaves
out a public repository's Read collaborators, so dev/nisse never showed up.
`repositories` now holds patterns (dev/nisse, dev/*, */*) matched against
every repository the account can read, public ones included (an
organization's or user's list, or the instance's search); unset, it is
/user/repos as before. A configured repository it can't read is left out
with an oplog line.
The read-only wall (R3) is checked every round, not only at startup: an
account granted push or admin while running stops (exit 3) rather than
review on.
nisse-core's Gitea client gains GiteaNotFound for 404s, owner_repositories
and visible_repositories.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Found at bring-up: nisse-review started "reading no repositories". Gitea's
/user/reposleaves out a public repository's Read collaborators, sodev/nissenever appeared, even afternisse-reviewwas added as a Read collaborator. Settled with the operator: option (a), the configuration decides for public repositories.Changes
repositoriesholds patterns:dev/nisse,dev/*,*/*. They're matched against every repository the account can read, public ones included: an organization's (or user's) list forowner/*, Gitea's search for*/*. Unset, it uses/user/reposas before. A configured repository it can't read is left out, with anaccess.unreadableoplog line; an unknown owner getsaccess.no_owner. Patterns that aren'towner/nameare config errors.AccessRefusedand nisse-review exits 3 instead of reviewing on.GiteaClient:GiteaNotFound(aGiteaError) for 404s,owner_repositories(owner)(/orgs/…/repos, then/users/…/repos) andvisible_repositories()(/repos/search).Tests
/user/repos, and a round picks up only the matching ones.GiteaNotFound.After merge, I'll restart the bring-up with
repositories: ["dev/*"].🤖 Generated with Claude Code
https://claude.ai/code/session_01J5Utyfzw7gF7UhjRDEtjTk