Watch
0
0
Fork
You've already forked hyperhive
0
hyperhive/hive-forge-notify
Repository files (latest commit first)
Filename Latest commit message Latest commit date
damocles c5729b4124 forge notify: a review stays in the todo's inline block until the agent answers it, not just until it was delivered once
The todo row is last-write-wins, so a review delivered in one version of the row disappeared when a later comment rewrote it, because the inline tail only listed reviews newer than the last delivery. The baseline is now the agent's own last review or comment on the thread.
2026-11-11 19:12:06 +01:00
..
src forge notify: a review stays in the todo's inline block until the agent answers it, not just until it was delivered once 2026-11-11 19:12:06 +01:00
Cargo.toml retry the remaining plain schedules with backon 2026-10-17 16:33:21 +02:00
README.md docs: the handbook follows the three layers: swarm, hives, agents 2026-11-07 12:19:36 +01:00

hive-forge-notify

Per-agent Forgejo notification poller: a long-running daemon (hive-forge-notify) that watches the agent's unread notification list and turns each thread into a todo the harness surfaces in get_loose_ends. This is why an agent wakes up when someone comments on its issue or requests its review.

When to use it

Look here when changing what a forge notification says when it reaches an agent, or when it reaches one at all: the poll cadence, the self-echo filter, the comment / review / new-item / state-change wrapper formats, body-excerpt truncation, and the assigned-issue rollup all live in notify.rs. The behaviour contract — activation gates, filtering rules, the review-request override — is documented in docs/2-handbook/swarm/forge.md, "Notification poller".

Shape

One bin, three modules:

  • main.rs — argument-free entry point. Reads HIVE_AGENT_SOCKET, initialises tracing, hands off to notify::run.
  • notify.rs — the poller: forge client setup, the 30s loop, the formatters, mark-read, and the in-process delivery-dedupe map.
  • todo_client.rs — one-shot JSON-line client for the harness's in-agent socket. No retry schedule of its own; see the module doc.

Why it is a separate process

It used to be a tokio::spawn inside the hive-agent serve loop. It never needed anything from the serve loop except a socket path, and running it in-process meant a harness restart also took forge notifications down, and linked the whole forge/HTTP dependency tree (forgejo-api, reqwest, time, url) into the serve-loop binary. It is now a sibling daemon alongside hive-bash-daemon and hive-matrix-daemon, with the same contract: it talks to the harness over the in-agent todo socket and nowhere else.

Forge's own read-state is the durable, cross-rebuild record of what has been delivered — there is no persisted cursor to migrate or corrupt. A restarted poller re-scans only the genuinely-still-unread set, which is tiny by construction because delivery marks the thread read.