Read Chinese connect-screen counts, and stop typing WHO at a listed game that states one - #183
Conversation
…ame that states one
A family of Taiwanese and mainland MudOS/ES2 games negotiates nothing, publishes
no MSSP, and reads every line we send at its login prompt as a character name —
so a pre-login WHO comes back `Unknown — asked, unreadable`, every crawl, for
ever. Each of them states its player count plainly on the connect screen, in
Chinese, where nothing here could read it.
ChineseCount reads it. Grown from a sweep of all 904 stored connect screens on
2026-09-17: 33 carry Chinese player vocabulary, 21 state a count, 20 resolve, one
is refused for stating two different figures, and nothing in the other 883
matches. Six games with no count at all now have one.
The shape is one sentence carrying three figures —
`目前共有 0 位巫師、83 位玩家在線上,以及 1 位使用者嘗試連線中。` — so the reader
works clause by clause and binds a number to 玩家 rather than disqualifying a
line the way the English reader does; there is no line to disqualify. Staff,
users still connecting and characters-ever-created need no exclusion list because
they are never matched. A clause naming a cap, a record, a cumulative visit count
or the address *you* are at states something other than the population now and
offers no candidate. fs.twkang.net:5555 names no player noun at all — `線上 2` —
so the bare connectivity form is read too, exactly as lusternia's "Currently
On-Line: 12" is in English.
ProbeTarget.AwaitingCorroboration then lets that count buy the same silence an
MSSP report buys. The gate it opens guarded a submission's listing, and that risk
ends: MuLikeness has exactly one consumer, CatalogueBinder.CorroborateAsync, and
that one returns early unless the game is { SubmittedAt: not null,
CorroboratedAt: null }. Afterwards a WHO typed to produce a §7.8 signal produces
one nothing reads. It defaults to true everywhere, so a caller that cannot answer
keeps asking; only the crawl loop, which has the catalogue, ever sets it.
Verified against the live servers, not only the fixtures: fs.twkang.net:5555 now
reads `who NotAsked`, `banner count 2 (stated in the connect screen)`, and
doom.twmuds.com:4000 reads 27 off its own screen rather than falling back to its
MSSP figure.
INFO and VERSION are still typed at the same prompt and are not fixed here —
#182.
Also: mui-probe printed the count that bought a skipped WHO as "stated in the
connect screen", which reads an MSSP figure back as somebody's banner. It now
says which of the two it has, and takes --listed so the suppressed WHO can be
reproduced by hand.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Essentials Run ID: 📒 Files selected for processing (13)
Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 2 reviews per hour. WalkthroughThe crawl now parses supported Chinese connect-screen player counts and tracks corroboration state from storage to probing. Listed targets can use banner counts without protocol negotiation, while targets awaiting corroboration still require a parseable WHO response. ChangesChinese count extraction and validation
Corroboration state
Probe decision flow
Priority: ➖ Normal Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Feature Sequence Diagram(s)sequenceDiagram
participant CrawlTargetRepository
participant CrawlCycle
participant TelnetProbe
participant BannerCount
CrawlTargetRepository->>CrawlCycle: provide AwaitingCorroboration
CrawlCycle->>TelnetProbe: forward probe state
TelnetProbe->>TelnetProbe: decide whether WHO is required
TelnetProbe->>BannerCount: parse connect-screen banner
BannerCount-->>TelnetProbe: return BannerPlayerCount
Merge Risk: ⚪ Minimal · up to No actionable merge risk remains; the new banner-count and corroboration behavior has targeted test coverage. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 78.57% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 28 functions across 11 files. (2 skipped: 2 unsupported.)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Comment |
fs.twkang.net:5555(狂想空間 / Fantasy Space) states its player count three lines above itslogin prompt and we could not read it, so we typed
WHOat that prompt instead — and the gameread the word as a character name. Every crawl, for ever. It is not one game: the whole Taiwanese
and mainland MudOS/ES2 family behaves this way.
Reading the count
ChineseCountis grown from a sweep of all 904 stored connect screens on 2026-09-17, againstevery decoding a staff
CHARSEToverride could produce. Thirty-three carry Chinese playervocabulary, twenty-one state a count, twenty resolve, one is refused for stating two different
figures, and nothing in the other 883 matches.
ChineseCountTestscarries all twenty-one asfixtures.
The shape is one sentence carrying three figures:
So the reader works clause by clause and binds a number to 玩家 rather than disqualifying a
line the way
BannerCount.CountsOnlyStaffdoes in English — there is no line to disqualify when allthree figures share one. 巫師/巫师, 管理者, 使用者/用戶 and 角色 (characters ever created) need no
exclusion list, because they are never matched.
A clause naming 上限 (a cap), 最高/紀錄 (a record), 人次 (cumulative logins), 今日/本週, or 您所在
(the address you are at —
您所在的地址已有 0 位玩家在线上is a per-IP line on two games) statessomething other than the population now and offers no candidate at all.
fs.twkang.net:5555names no player noun anywhere —線上 2— so the bare connectivity form isread too, exactly as
lusternia.com:5000'sCurrently On-Line: 12is in English. Spaces and acolon are the only separators it admits, because
mud.revivalworld.org:4000's共計 4 人正在線上,1 人正在登入would otherwise read as one.The plausibility ceiling and the two-disagreeing-figures refusal are
BannerCount's own and applyunchanged. Counts in Chinese numerals stay unread, as the 2026-08-20 survey left them.
Six games with no count at all now have one —
210.59.236.38:7788(67),fss.twcos.com:5000(18),
us.muds.net:4000(32),210.59.236.38:7000(9),es.clovers.tw:8000(93),202.103.21.247:8888(34) — plusfs.twkang.net:5555(2). Fourteen more gain a measured screencount beside their declared MSSP one, and two disagree loudly (
jy.mud.com.tw:6666declares 44and states 83). Keeping both is the point.
A Big5 or GBK screen still reads as none of this until an operator sets
CHARSET—WireEncodingwill not guess between two legacy encodings (rule 5). That is the correct order of operations, not a
gap.
Stopping the WHO
PublishedCountAsync's screen rung required a protocol signal in the session, because for a serverthat negotiates nothing a parseable
WHOis its only §7.8 evidence of being a game, and talkingourselves out of asking would cost it its listing.
That risk has an end, and it is narrower than the rule assumed.
MuLikenesshas exactly oneconsumer —
CatalogueBinder.CorroborateAsync— and that one returns early unless the game is{ SubmittedAt: not null, CorroboratedAt: null }. Once a game is listed, nothing reads thosesignals again, so a
WHOtyped to produce one is a command at a stranger's login prompt fornothing.
So
ProbeTarget.AwaitingCorroboration, fed fromCrawlTarget.AwaitingCorroboration, joined out ofgame.submitted_at IS NOT NULL AND game.corroborated_at IS NULLin the due-targets query the sameway the
CHARSEToverride already is. It defaults totrueeverywhere, somui-probe, everyexisting test and any future caller that cannot answer keeps the probe asking; only the crawl loop,
which has the catalogue, ever sets it. A target with no game bound yet reads as
true— an addressthat has proved nothing is asked everything.
Measured, not reasoned
Four games probed live before anything was written:
fs.twkang.net:5555,210.59.236.38:7788,es.clovers.tw:8000,us.muds.net:4000. All fournegotiated (none observed),mssp NotOffered,who Unknown — asked, unreadable. Atfsthe full chain isWHO→ 好吧﹐那麼請重新輸入您的英文名字﹕ →
INFO→ the same →VERSION→ 使用 version 這個名字將會創造一個新的人物﹐您確定嗎(y/n)﹖ — one
yfrom creating characters on somebody's game.Verified against the live servers after the change, not only the fixtures:
AListedGamesScreenCountBuysSilenceEvenWithNoNegotiationAtAllwas confirmed to fail against the oldgate before the gate was changed.
Also in here
mui-probeprinted the count that bought a skippedWHOas (stated in the connect screen),which reads an MSSP figure back as somebody's banner. It now says which of the two it has, and
takes
--listedso a suppressedWHOcan be reproduced by hand.CLAUDE.md's §7.8 sentence anddocs/codebase-survey-2026-07-30.mdupdated with the sweep andthe reasoning.
Not in here
INFOandVERSIONare still typed at the same login prompt, becauseMsspSelfDescriptiongatesthem on MSSP and these games publish none. There is nothing they would publish either, so
"not asking must imply publishing" has nothing to hold on to and the fix is a different shape —
#182.
Tests
All six suites, Postgres exercised rather than skipped:
0 failed, 0 warnings, clean Release build.
🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes