-
-
Notifications
You must be signed in to change notification settings - Fork 0
Serve the real catalogue, and walk a referral graph in the wild #9
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,53 +1,64 @@ | ||||||||||||||||||||
| # Screenshots — 30 July 2026 | ||||||||||||||||||||
| # Screenshots — 31 July 2026 | ||||||||||||||||||||
|
|
||||||||||||||||||||
| Captured from the running site at `31f5864`, rendering from `FixtureGameQueries`. Every value in the | ||||||||||||||||||||
| fixture came off a real server, which is why the hard states appear at all. | ||||||||||||||||||||
| Captured from the running site against **a real PostgreSQL catalogue**, populated by `mui-crawl` | ||||||||||||||||||||
| against live servers: sixteen games, one probe each. Nothing here is a fixture. The site prefers a | ||||||||||||||||||||
| database and falls back to the demo fixture only when none is configured — and when it does, every | ||||||||||||||||||||
| page carries a banner saying so, because a reader who cannot tell a measurement from a fixture is | ||||||||||||||||||||
| being misled by exactly the mechanism this project exists to replace. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| | File | What it shows | | ||||||||||||||||||||
| |---|---| | ||||||||||||||||||||
| | `01-home-feeds.png` | The three liveness feeds. The *came back* card is the one place the site raises its voice. | | ||||||||||||||||||||
| | `02-games-listing.png` | The listing, with a measured zero, an unknown count and an archived game distinguishable at a glance. | | ||||||||||||||||||||
| | `03-game-page.png` | The whole game page: ANSI frame, heatmap, reachable strip, capability matrix, provenance. | | ||||||||||||||||||||
| | `01-home-feeds.png` | The three liveness feeds, off a first crawl: sixteen games *newly discovered*. | | ||||||||||||||||||||
| | `02-games-listing.png` | The listing. Measured counts, measured zeroes, and games whose handshake offered nothing. | | ||||||||||||||||||||
| | `03-game-page.png` | Virtustan MUD — the whole game page, and the game that led the crawler to two more endpoints. | | ||||||||||||||||||||
| | `04-plain-mode.png` | `?plain=1` — the same facts as words. | | ||||||||||||||||||||
| | `05-archive.png` | The archive as a section rather than a bin. | | ||||||||||||||||||||
| | `05-archive.png` | The archive. Empty, and saying so: nothing has been dark long enough. | | ||||||||||||||||||||
| | `06-mobile-game.png` | 390px. Single column, heatmap keeps all 168 cells. | | ||||||||||||||||||||
|
|
||||||||||||||||||||
| ## What to look for | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **The game page leads with the game.** Mark, name, description, address — then the connect screen | ||||||||||||||||||||
| under *"what you see when you connect"*, which is what it is: the first piece of evidence, not the | ||||||||||||||||||||
| masthead. Leading with the art would hand the top of every page to whatever a stranger's server sends. | ||||||||||||||||||||
| **Every page is one probe old, and the page says so rather than pretending otherwise.** This is what | ||||||||||||||||||||
| makes the set worth keeping: it is the site's *first day*, which is the state every real game enters | ||||||||||||||||||||
| in, and it is where three sentences turned out to be lying. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **`GMCP` sorts to the top of the capability matrix and is labelled `DISAGREES`.** Its MSSP says | ||||||||||||||||||||
| `claimed`, six years old; the handshake has never offered it. That disagreement is the single most | ||||||||||||||||||||
| useful thing the matrix can say, so it cannot be scrolled past. | ||||||||||||||||||||
| **"Reachable 100.0% of the 1 day we have measured."** The fraction's denominator has always been | ||||||||||||||||||||
| observed time; the sentence used to widen it to "of the last 90 days". Right number, claim | ||||||||||||||||||||
| eighty-nine days wider than the evidence. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **The heatmap has three states and they are told apart by shape.** Filled is counted — *including a | ||||||||||||||||||||
| measured zero*. Hatched is probed-but-uncountable (see Friday). Empty is not reachable (Wednesday's | ||||||||||||||||||||
| twelve-hour band). Greyscale printing is a valid rendering of this grid. | ||||||||||||||||||||
| **The heatmap's empty cells read *no measurement in that hour*.** They used to read "not reachable — | ||||||||||||||||||||
| no measurement at all", and the summary said "167 hours across the week could not be measured — the | ||||||||||||||||||||
| game was not reachable", about a game measured once and found perfectly reachable. A failed probe | ||||||||||||||||||||
| writes no presence row, so silence there cannot tell an outage of theirs from a gap of ours. | ||||||||||||||||||||
| Reachability is the strip's question, and the strip is derived from intervals that can. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **The reachable strip has four states, not three.** The fourth is *not measured* — the strip is 90 | ||||||||||||||||||||
| days wide, and a game found last Tuesday has no history before that. Painting those days unreachable | ||||||||||||||||||||
| would record our ignorance as their measurement. | ||||||||||||||||||||
| **"What the game says about itself" contains only things the game said.** `banner_hash` — a digest | ||||||||||||||||||||
| *we* compute, 64 hex characters wide — used to sit at the top of that panel, off the edge of its | ||||||||||||||||||||
| column. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **Ages are relative and stale ones are marked.** `created 2009 ◇ 6y` is not wrong, it is old, and the | ||||||||||||||||||||
| page says so rather than presenting it as current. | ||||||||||||||||||||
| **The three states are still three states.** Filled is counted, including a measured zero (see | ||||||||||||||||||||
| `eldertaleonline.com`, which answered and had nobody on). Hatched is probed-and-uncountable. Empty is | ||||||||||||||||||||
| no measurement. Greyscale printing is a valid rendering of this grid. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| **It is called *reachable*, never *uptime*.** We measured a socket from one vantage point; we did not | ||||||||||||||||||||
| measure whether the game was up. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| ## The plain rendering is the test | ||||||||||||||||||||
|
|
||||||||||||||||||||
| `04-plain-mode.png` is not a courtesy. If a fact cannot survive there, its graphic on the main page | ||||||||||||||||||||
| was decoration. Compare: | ||||||||||||||||||||
| was decoration — and the plain surface carried the same wrong sentence, in the same words, which is | ||||||||||||||||||||
| what makes it a real parity check rather than a second implementation. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| ``` | ||||||||||||||||||||
| Wed — peak 13 at 20:00, 12 hours not reachable | ||||||||||||||||||||
| Fri — peak 16 at 20:00, nobody on 05:00-11:59, 1 hour probed but uncountable | ||||||||||||||||||||
|
|
||||||||||||||||||||
| counted = we got in and read a number, including a measured zero | ||||||||||||||||||||
| uncounted = we got in and no number could be read | ||||||||||||||||||||
| no data = we could not reach the game in that hour at all | ||||||||||||||||||||
| no data = we have no measurement for that hour | ||||||||||||||||||||
| ``` | ||||||||||||||||||||
|
Comment on lines
51
to
55
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win Specify the fenced-block language. Markdownlint reports MD040 for this fence. Add Proposed fix-```
+```text
counted = we got in and read a number, including a measured zero
uncounted = we got in and no number could be read
no data = we have no measurement for that hour📝 Committable suggestion
Suggested change
🧰 Tools🪛 markdownlint-cli2 (0.23.1)[warning] 51-51: Fenced code blocks should have a language specified (MD040, fenced-code-language) 🤖 Prompt for AI AgentsSource: Linters/SAST tools |
||||||||||||||||||||
|
|
||||||||||||||||||||
| Three states, in words, with no colour to carry them. | ||||||||||||||||||||
|
|
||||||||||||||||||||
| ## Reproducing | ||||||||||||||||||||
|
|
||||||||||||||||||||
| ```bash | ||||||||||||||||||||
| mui-crawl --connection "…" --seed mush.pennmush.org:4201 --seed mud.kharkov.org:3000 … | ||||||||||||||||||||
| MUI_POSTGRES="…" dotnet run --project src/MUI.Web | ||||||||||||||||||||
| ``` | ||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Remove the committed live-crawl catalogue snapshot.
The screenshots and their README contain live measurements. They are not hand-written test fixtures. Keep an operator-local reproduction procedure, but do not retain or link generated live-catalogue output.
docs/screenshots/README.md#L3-L16: Remove the live-crawl screenshot provenance and remove the generated screenshot assets from version control.README.md#L9-L12: Remove the link and claims that publish the committed live-crawl screenshot set.As per coding guidelines, “Do not commit harvested datasets, mirrored listings, scraped seed lists, or catalogue snapshots.”
📍 Affects 2 files
docs/screenshots/README.md#L3-L16(this comment)README.md#L9-L12🤖 Prompt for AI Agents
Source: Coding guidelines