What happens. The badge counts as a host the parent of every covered account that spoke, whatever that parent is. A session that scrobbles and has a scrobbling subagent is counted once as an agent and once as a host. The board decides host or agent from the registration's kind, or for an account without one, a root with no lines and children of its own, and draws that session as an agent.
How to reproduce. crates/vibescrobble-query/src/badge.rs:266-271: if spoke { agents += 1; if let Some(parent) = .. { if accounts.contains(parent) { hosts.insert(parent.clone()) } } }. The board's rule is isHost in web/look.js:956-959. Take session S (registered kind: agent, or no registration) with subagent A, both of which have written lines. S's own badge covers S and A (badge.rs:319-332) and reads "2 agents · 1 host", naming S as its own host. A person's badge over host H, session S and subagent A reads "2 hosts" where the board draws one.
Why it matters. The badge is meant to sum up what the board shows, and its host count goes up with every level of subagent. It also disagrees with the registration kind, which is the one place that says what an account is.
Fixed by https://tangled.org/permadeath.com/vibescrobble.com/pulls/353, now on main.