Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

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.