From e5e18dae62d2eee37ce8c10542db9b2558b822fc Mon Sep 17 00:00:00 2001 From: Harry Cordewener Date: Sat, 15 Aug 2026 01:21:19 -0500 Subject: [PATCH 1/2] A badge that would rather say nothing than say nought MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §8.5's owner-published outputs: /g/{slug}/badge.svg and /g/{slug}/badge.json, public and CORS-open because the whole point is a page we do not control. This is the surface with the least room and the most exposure, and none of the rules bend for it. The count carries its own age. "15" on somebody's front page is the incumbents' badge; "15 now · 4m ago" is ours, in nine more characters. That needed GameSummary to know WHEN the count was measured, which it did not — §10.1 names that gap as the one place this project contradicts itself, and PlayersNowAt closes it for the field a third party is most likely to republish. A count with no age reads as unknown rather than as a bare figure. An unknown count is never a zero. A game whose WHO we cannot parse renders "players unknown" in grey; a measured zero renders "0 now" in the accent, because we got in and nobody was there and that is a real fact. The first would be our parser's limit printed as a fact about their game, on their own website, where we could not correct it — rule 4 where it does the most damage. An archived game says archived rather than showing the last number it had. The state is decided before the count, so a game that stopped answering in 2023 cannot wear a live-sounding figure. The accent means measured everywhere on this site and is spent nowhere else, so an unknown badge is grey. A game's name is MSSP text and therefore attacker-controlled. It reaches the accessible title and nowhere else, escaped: an SVG is a document, and a game named "); + + await Assert.That(svg).DoesNotContain("