fix: count distinct solvers and hedge when the sample is incomplete
Adversarial review found the public congrats copy could report wrong
numbers:
- solvers was counted per result-record, so a player with two records
was counted twice, and solvers could exceed the distinct-DID players
count, yielding copy like "Congrats to the 25" when only 20 played.
- the exact "X solved, Y didn't" branch subtracted a full-population
players count from a capped/lossy solvers sample, so a truncated page
or a dropped record produced an inflated non-solver number.
- the sampled hedge was keyed on raw record count, over-hedging at
exactly the cap and never reflecting partial pagination.
Now solvers is the count of distinct winning DIDs, clamped to players;
collectBacklinks fetches cap+1 and reports truncated; and yesterdayCounts
marks the result sampled whenever the sample is incomplete (truncated,
null player count, or fewer distinct players resolved than counted).
compose no longer claims "nobody cracked it" on an incomplete sample.
Adds test/counts.test.ts covering dedupe, clamping, lang/puzzle
filtering, the sampled boundary, dropped reads, and null players.