Why
#14 ends with “external review focused on CI runner isolation and the WebAuthn/session flow”, and it is the one item on that list we cannot close with a change request. It is an engagement with someone outside the project, and what it produces is findings, not a branch.
Two boundaries in Vole are worth an outside pair of eyes precisely because the project cannot test its own assumptions:
- The CI runner. A job container executes arbitrary repository code. What it
can reach depends on how the runner process was started, which the server
cannot see, and the trust story in
docs/architecture.mdanddocs/runner.mdrests on choices rather than on an isolated test. - The browser sign-in flow. Passkeys, sessions, invite tokens, and the
ceremony map are the only anonymous endpoints that mutate state, and the
recovery paths (lost device, revoked session, restored
users.db) are conditions that are hard to exercise honestly from inside.
Scope
This is not a change request. It is:
- Choose a reviewer with container-escape and WebAuthn experience, and agree the scope in writing: the runner boundary, the sign-in flow, and the documents that describe them.
- Give the reviewer a way to run the instance: the packaging, a
docs/operations.mddeployment, and a runner. No production data, no maintainer keys, and no other account’s material. - Take the report, and file each finding as its own issue with a severity and a link back here, before writing any fix. Responsible disclosure applies: do not paste exploit detail for an unfixed finding into a public issue.
- Record what was covered and what was not on this issue, so a later review can start from the edge of this one.
Acceptance
- A report exists covering both boundaries, or a written statement that one of them was out of scope and why.
- Every finding is either an issue or an explicit “accepted risk” with the reason recorded.
- Nothing from the report that could be used against a running instance is in this issue, a comment, a commit, or a release note.
- This issue closes on triage, not on the fixes: the fixes are their own issues.
Part of #14.