vole
Clone
Read only, no credentials:
https://rodent.software/git/vole.git
Write over SSH with a registered key:
git clone ssh://git@0.0.0.0:2222/vole.git
A free and open-source forge that lives in your Git repo.
Roadmap: close out the stale status markers
21d48210c27d9802ce585a78b0c45b66ccb984a5 · Keenan Nemetz · 16d ago · parent 44530e74
Roadmap: close out the stale status markers Four headings were out of date in ways that would mislead a reader rather than merely look untidy: - Phase 4 had no `complete` marker despite every slice being done, while every other finished phase had one. - Phase 5 still said "artifact uploads and locking deferred". Artifact uploads landed as run artifacts in Phase 7 slice 6, so only locking is actually deferred. - Phase 3 said its exit criteria were "met, except review comments". Review comments landed later in that same phase — discussion first, then blob-anchored line comments — so nothing on the list is outstanding. - Phase 3.5 said "Done" in its body but not in its heading. Three of the four open questions were also already answered, and leaving them listed as open is worse than having no list: someone reading "SSH transport may ship early" has no way to know it has been the only write transport since Phase 1. They are kept with their answers, because the answers are worth finding. Only email deliverability is genuinely open, and it is now really a Phase 8 question — it exists to serve the notifications Phase 2 deliberately did not build.
docs/roadmap.md +23−16
| @@ -302,13 +302,15 @@ branch or a head that was never pushed produces silence, because a page that say | |||
| 302 | 302 | same view now states the requirement ("0 of 1 required approval(s)"), which used | |
| 303 | 303 | to be a number the reviewer had to remember. | |
| 304 | 304 | ||
| 305 | **Exit criteria:** met, except review comments. Verified end to end: a | ||
| 305 | **Exit criteria:** met. Verified end to end: a | ||
| 306 | 306 | writer cannot land on a protected branch without approvals, an amended head invalidates a | |
| 307 | 307 | prior approval, an approval for `main` cannot be repointed at another branch, a | |
| 308 | 308 | self-approval or impersonated approval is refused, an admin bypass works, and each merge | |
| 309 | is written to the audit log with the request id and approvers. | ||
| 309 | is written to the audit log with the request id and approvers. Review comments were the | ||
| 310 | one item outstanding when this was written; they landed in the two sections above, so | ||
| 311 | nothing on the original list is left. | ||
| 310 | 312 | ||
| 311 | ### Phase 3.5 — the roster | ||
| 313 | ### Phase 3.5 — the roster — ✅ complete | ||
| 312 | 314 | ||
| 313 | 315 | ✅ **Done.** `data/users.db` is the user roster: one account per row with a stable | |
| 314 | 316 | id, a mutable name, a status and its SSH public keys. `user_names` holds every name | |
| @@ -337,7 +339,7 @@ was a commit on a second repository that existed only for this, the client read | |||
| 337 | 339 | key) fell out of table keys instead of a parse step. The instance landing page it was | |
| 338 | 340 | also meant to host is served from trees by Phase 6, so nothing else depended on it. | |
| 339 | 341 | ||
| 340 | ### Phase 4 — CI/CD | ||
| 342 | ### Phase 4 — CI/CD — ✅ complete | ||
| 341 | 343 | ||
| 342 | 344 | ✅ **Slice 1 — workflow format and validation.** `.vole/workflows/*.yaml` is parsed and | |
| 343 | 345 | validated in `pre-receive` for any push that touches it, so an invalid file fails the | |
| @@ -606,7 +608,7 @@ a push whose spool file was never written still runs ✅ (the refs are reconcile | |||
| 606 | 608 | by `TestReconcileRebuildsAQueueThatWasDeleted`, which deletes the queue and its WAL and | |
| 607 | 609 | gets the live tip queued again). | |
| 608 | 610 | ||
| 609 | ### Phase 5 — LFS — ✅ complete (artifact uploads and locking deferred) | ||
| 611 | ### Phase 5 — LFS — ✅ complete (locking deferred) | ||
| 610 | 612 | ||
| 611 | 613 | ✅ **Slice 1 — the store, and reads through the proxy.** Objects live at | |
| 612 | 614 | `data/lfs/objects/<aa>/<bb>/<sha256>`, shared by every repository on the instance, and | |
| @@ -1101,15 +1103,20 @@ Filled in as phases land. Append; don't rewrite. | |||
| 1101 | 1103 | ||
| 1102 | 1104 | ## Open questions | |
| 1103 | 1105 | ||
| 1104 | - Workflow YAML dialect: own minimal schema, or a subset of GitHub Actions for familiarity? | ||
| 1105 | Leaning own schema — a subset that silently differs from the real thing is worse than a | ||
| 1106 | clearly separate one. | ||
| 1107 | - Whether Phase 1 ships SSH transport early because operators expect it, despite HTTP | ||
| 1108 | being sufficient. Defer until someone actually complains. | ||
| 1109 | 1106 | - Email deliverability: rely on operator SMTP, or bundle a fallback? Leaning operator SMTP | |
| 1110 | only, with a loud warning when unconfigured. | ||
| 1111 | - **Change-request approvals need an authenticated write surface**, which the | ||
| 1112 | read-only web cannot provide. Either review moves to the CLI over SSH | ||
| 1113 | (`vole review approve 12`, authenticated by the same key, updating a CR ref), | ||
| 1114 | or authentication returns for that one surface in Phase 3. Decide before | ||
| 1115 | designing the review UI. | ||
| 1107 | only, with a loud warning when unconfigured. This is really a Phase 8 question now: it | ||
| 1108 | exists only to serve the notifications Phase 2 deliberately did not build. | ||
| 1109 | |||
| 1110 | Answered since this list was written, kept here so the answers stay findable: | ||
| 1111 | |||
| 1112 | - **The workflow dialect is Vole's own minimal schema**, not a subset of GitHub Actions — | ||
| 1113 | a subset that silently differs from the real thing is worse than a clearly separate one. | ||
| 1114 | `runs-on` (Phase 4 slice 12) was added on that basis: one label or a list, lowercase, | ||
| 1115 | validated at push, with its own error messages rather than GitHub's. | ||
| 1116 | - **SSH shipped first and answered itself.** It arrived in Phase 1, and HTTP ended up | ||
| 1117 | read-only, so there was never a "should SSH come early" trade to make: SSH is the only | ||
| 1118 | write transport and HTTP is anonymous read. | ||
| 1119 | - **Change-request approvals needed no authenticated write surface.** They are push-based: | ||
| 1120 | `vole request approve` commits an approval file on `refs/heads/vole`, and `pre-receive` | ||
| 1121 | refuses any approval whose name is not the account the SSH key resolved to. The web | ||
| 1122 | stayed read-only, which is the decision that made the rest of the phase small. | ||