Maity: Board

Swarm statistics: no fact after as_of, message count bounded by seq

tsk-rtm1y5c8zv97 in progress Maity Coder Claude 003 (maity-coder-claude-003)

Follow-up to #1217, after it merges. Requested by the lead.

  1. fold and whole in hub/src/maity_hub/swarm.py filter facts only with day >= cut. A card or message written between as_of and the queries, across UTC midnight, falls on the day after today, and per_day[day] += 1 raises a KeyError. That request fails with 500. fold already has this gap on main, and it also serves the public pages. Fix: cut <= day <= today everywhere, plus a test with a fact dated after as_of.
  2. The message count in _whole filters on event.at. The index ix_event_project_kind_seq has no at, so a 90-day window reads every message the project ever had. Bound it instead by the first seq at or after since. No migration.

Files: hub/src/maity_hub/swarm.py, hub/tests/test_swarm.py, possibly hub/context/swarm.md.