Observed live on production after renaming brintos/brintos-fs → brintos/brintos-fs-go (2026-07-13 ~07:18 UTC):
$ git ls-remote git@git.brintos.io:brintos/brintos-fs-go.git HEAD
fatal: '/tmp/git-edge-mnt-4020514352/fff12299-….git' does not appear to be a git repository
Web/API access to the repo is fine; only the git protocol path is broken, persisting 40+ minutes after the rename (well past the 12-minute pool idleTTL).
Cause
pool.go keys pool entries by repo id but binds each mount's API client to the slug captured at mount time:
repoClient := apiClient.Repo(owner, repo) // pool.go:165 — owner/name, not id
c, err := cache.Open(repoClient, cache.Options{
DBPath: filepath.Join(config.CacheDir(), "repos", e.repoID, "meta.db"), // id-keyed
...
After a rename, requests arriving under the new slug resolve to the same repo id, hit the existing pooled entry, and its mount keeps issuing /fs/* calls under the old slug — every one 404s, the mirror poisons with negatives, and git-http-backend/upload-pack sees an empty dir. The wedge outlives idleTTL in practice: each incoming attempt refreshes e.lastUsed (and any ref leaked by the failing SSH path would pin e.refs > 0), so steady probing keeps the corpse alive indefinitely. Recovery requires a git-edge restart or maintenance unmount.
Suggested fixes (any one suffices)
- Resolve the slug per mount from the repo id at bring-up, or have
/api/internal/git/mount-tokenreturn the canonical slug and re-check it when acquiring a pooled entry (unmount on mismatch). - Have the rename path (
update_repo) notify git-edge to drop the repo's pool entry (there is already a secret-gated maintenance endpoint). - Key the API client by repo id server-side (id-addressed
/fs/*routes), making the edge rename-proof.
Until fixed: after renaming any git repo, bounce git-edge (or hit the maintenance unmount) before git access resumes.