Files
gitea-review-bot/ROADMAP.md
T
Keysat 907b83388b Adjudicate 2026-07-29: drop the wedged-loop heartbeat, add a hang-bounding fold-in
Heartbeat dropped: a Docker healthcheck badge restarts nothing under this
container's setup, spark-control's tile would need its own change to read it,
and serial per-room polling (a review may run 10 min) makes any staleness
threshold either too loose to be timely or noisy mid-review. No wedge has ever
been observed. Reopens on an observed wedge plus confirmation the tile already
renders Docker health.

Replaced by a fold-in, since the realistic failure is a hang rather than a
crash: bound the two unbounded awaits in src/bot.py and stop the process if the
poll task ever dies, letting restart: unless-stopped and the existing
spark-control tile cover it.

AGENTS.md Current state reconciled to match. Phase 3's onboard-3-repos verify
item stands (inside the 14-day skip window).
2026-07-29 20:09:42 -05:00

2.2 KiB

gitea-review-bot — ROADMAP

Phases beyond the first milestone (threaded single-flow review + merge/reject/deploy; see AGENTS.md ## Current state).

Phase 3 — Multi-repo at scale

  • Onboard ≥3 repos to their own rooms; confirm independent polling, no cross-talk. Exit: three repos reviewed from three rooms in one run. (adjudicated 2026-07-18: verify — needs no new code; rooms are already independent (per-room heads/threads/agents are namespaced, merge-confirm state is keyed by room+PR). Check plan, when a real 2nd/3rd repo is onboarded: watch one poll cycle in docker compose logs -f. Note the exit criterion is mis-stated — reviews run serially (one async task walks the rooms in turn), so "no interleaving" is trivially satisfied; the thing actually worth watching at 3+ repos is a long review head-of-line-blocking the next room's poll, i.e. the latency problem the deferred poll→webhook item anticipates.)

Fold-ins — do opportunistically, never a session of their own

  • (fold-in, not a session of its own) Next time src/bot.py's SSH or Matrix-send path is edited: bound the two unbounded awaits (await proc.wait() after the timeout kill in ssh_run; client.room_send in say()), and attach a done-callback to the poll task that stops the process if it ever dies, so the existing restart: unless-stopped + spark-control tile cover it. No hang has been observed; this is "unbounded is not a defensible default in a loop with no supervisor", not a fix for a diagnosed bug. (adjudicated 2026-07-29: fold-in only)

Deferred / non-goals

  • Not a Claude-session bot (that's matrix-bridge); not Maubot (revisit at ~6+ bots or web-UI mgmt); no GitHub/non-Gitea; no Gitea account/permission management; E2EE deferred (private LAN transport).
  • A shared "bot kit" library (extract the common matrix-nio + SSH plumbing across the three bots) once duplication bites — the lighter step before ever considering Maubot.
  • Poll → webhook upgrade if 60s latency ever matters.
  • Ops/dashboard tile lives in spark-control, not here — its Bots tab has shipped a gitea-review-bot tile since v0.28.0 (status badge, Update, Start/Restart/Stop, View logs), confirmed live.