Closed 2026-10-30: every P0 and P1 item shipped, and the P2 work this pointed at lives in #14.
Goal: make Vole safe to expose as a production forge. Close all P0 and P1 items before public deployment; P2 can follow after launch.
Threat model
- Trusted: host OS, instance admins, runner operators,
git, the OCI runtime. - Untrusted: anonymous web clients, repository content, contributors, workflows, site content, LFS/artifact bytes, invite links, and CI job containers.
- Semi-trusted: maintainers, who can write metadata and approve changes.
- Highest-risk boundary: a CI runner executes arbitrary repository code.
P0 — delivered before any public deployment
| Item | Issue | Landed in |
|---|---|---|
| Go toolchain update and vulnerability scanning | #2 | #16 |
| Bound and stream untrusted read-path objects | #3 | #47 |
| Git HTTP and HTTP server limits | #4 | #48 |
| SSH availability and host-key handling | #5 | #53 |
| Audit log trust | #6 | #52 |
Configuration validation and dev_login guard |
#7 | #49 |
| Deployment file modes and systemd hardening | #8 | #49 |
P1 — delivered before production traffic
| Item | Issue | Landed in |
|---|---|---|
| Auth, session, and invite-token hardening | #9 | #55 |
| ACL races and approval/runner authorization durability | #10 | #54 |
| CI runner trust boundary | #11 | #56, #57 |
| Web transport, URL generation, and CSP | #12 | #58 |
| Quotas and abuse controls | #13 | #59 |
What holds the line from here
The properties this issue was written to establish are now enforced by things that run, not by a checklist someone has to remember:
- Every push, in
.vole/workflows/verify.yaml:gofmt,go vet,go build,govulncheckpinned at v1.9.0 so a newly reachable vulnerability fails the push, a package build, the markdown links, andgo test -race. - Every tag, in
.vole/workflows/release.yaml:go vetandgo test,govulncheckbefore anything is built, a reproducible package build, andSHA256SUMSover every attached file. - The settings, in Operations § Production baseline: the addresses, limits, and defaults that matter on the day an instance is exposed, each pointing at the section that explains it.
Last full check on this line of main: vole workflow run verify on 2026-10-30,
all steps passing, 0 reachable vulnerabilities, every package green under
-race.
What this issue no longer carries
Two lines of the old definition of done were evidence rather than hardening: a
staging soak showing bounded memory, file descriptors, and process counts
(#102), and the incident-response half of the deployment runbook (#105).
docs/operations.md already covers TLS, the firewall, backups, and shipping the
audit log; the incident-response section did not exist.
Both are P2, both belong to #14, and neither was a P0 or P1 fix, so neither holds this issue open.
P2 post-launch work: #14.