agentbbs/internal
Anthony Ettinger 8689136aca fix(agentgit): register the member's SSH key on every BBS login, not just at signup
provisionGit returned early when the Forgejo account already existed, so
EnsureKey only ever ran during first provisioning. A member who deleted their
key on git.profullstack.com never got it back: every later BBS login hit the
`if !created { return }` and skipped key registration entirely. The comment on
the web verify path ("key is added on next BBS login") was describing behaviour
that could not happen.

Key registration now runs on every provisionGit call that carries a session
key. EnsureKey was already idempotent — it GETs the account's keys and compares
key material ignoring the comment — so re-running it is free when nothing
changed, and it re-adds a removed key, picks up a rotated one, and backfills
members who joined before AgentGit captured keys. The welcome email stays gated
on `created`, since the one-time password is only meaningful for a new account.

Two things that would have made this unreliable in the new every-login path:

- The key title was the constant "agentbbs". Forgejo rejects a duplicate title
  with 422, so a member who rotated their BBS key would have had the new one
  silently dropped. The title now carries a short fingerprint, so distinct keys
  coexist and the same key stays stable across logins.

- EnsureKey mapped *every* 422 to "already exists" and returned nil. That hid
  genuine rejections forever, which matters far more now the call is on the hot
  path. Only "has been used" bodies are swallowed; a rejected key surfaces with
  Forgejo's own reason so it lands in the logs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-24 11:26:54 +00:00
..
admin members: show joined date in admin + public lists; 'last active: X ago' 2026-07-01 02:40:24 +00:00
ascii Video calls (PairUX→ASCII), agent@ chat, and finger routes 2026-06-11 11:43:38 +00:00
auth feat(gopher): serve BBS content over Gopher + SSH-authenticated "hedgehog" (#83) 2026-07-07 05:39:35 -07:00
brand Use the Profullstack </> ASCII logo as the BBS banner 2026-06-14 16:46:59 +00:00
calls Video calls (PairUX→ASCII), agent@ chat, and finger routes 2026-06-11 11:43:38 +00:00
chat Video calls (PairUX→ASCII), agent@ chat, and finger routes 2026-06-11 11:43:38 +00:00
files Serve the OpenAccess descriptor at /.well-known/openaccess.json (#127) 2026-09-12 12:26:25 -07:00
forgejo fix(agentgit): register the member's SSH key on every BBS login, not just at signup 2026-09-24 11:26:54 +00:00
forwardemail Autonomous deploy + free-pod/Premium-email membership 2026-06-14 07:58:51 +00:00
games fix(games): reject duplicate queue entries (#117) 2026-08-12 21:20:18 -07:00
gopher fix(gopher): serve public files from SFTP storage (#115) 2026-08-12 19:20:06 -07:00
hub Fix/pod public html bind mount (#30) 2026-06-15 08:06:32 -07:00
ircpass fix(passwd): also reset The Lounge web-login password (#61) 2026-06-27 09:40:28 -07:00
mail fix(mail): unbreak join@ registration when the Mailu cert lapses (#129) 2026-09-22 07:40:15 -07:00
mailbox fix(mailbox): write messages before IMAP append wait (#113) 2026-08-11 17:44:33 -07:00
mailclients Add himalaya + meli mail clients and Shedding Snake arcade game (#88) 2026-07-10 02:30:12 -07:00
mailu Feat/mail all members (#55) 2026-06-23 03:38:31 -07:00
motd Wire shared MOTD into BBS hub and IRC 2026-06-25 11:51:06 +00:00
news fix(news): stop IHAVE when duplicate lookup fails (#89) 2026-07-12 00:43:24 -07:00
payments Rebrand paid tier to $99 Founding Lifetime Member 2026-06-14 12:46:23 +00:00
plugin fix(arcade): give ncurses games a TERM so they launch 2026-06-18 12:01:26 +00:00
pods feat(pods): SSH agent forwarding → git push from the pod with your key 2026-06-23 09:16:29 +00:00
qryptinvite fix(qryptinvite): validate quota and TTL env values (#93) 2026-07-16 19:01:41 -07:00
sandbox AgentBBS: M0 core hub, M1 arcade, pods with CoinPay membership 2026-06-11 11:08:17 +00:00
sites fix(sites): roll back failed domain claims (#119) 2026-08-13 02:34:30 -07:00
source fix: block shared/reserved IP ranges in SSRF guard (#47) 2026-06-22 05:23:15 -07:00
store fix(sites): roll back failed domain claims (#119) 2026-08-13 02:34:30 -07:00
tor tor: premium tor-url / tor-irc / tor routes over Tor 2026-06-14 10:54:21 +00:00
ui Fix/pod public html bind mount (#30) 2026-06-15 08:06:32 -07:00