Summary
During a triage pass, three symbols were found with zero references anywhere in src/, tests/, web/ or examples/.
1. boats.fishingCrewCount() — src/business/boats.py:385-388
def fishingCrewCount(player):
"""How many hands are actually out catching fish - crew on fishing boats
only. An unassigned worker, or one on a pirate boat, brings in no catch."""
return sum(crewSize(boat) for boat in boatsWithRole(player, ROLE_FISHING))
$ grep -rn "fishingCrewCount" --include='*.py' --include='*.js' .
src/business/boats.py:385:def fishingCrewCount(player):
An orphan of the fleet/roles rework (#139/#140). The rule it encodes now lives in _runFishingDay / dailyCatch.
2. export.MIN_EXPORT_BOAT_TIER — src/business/export.py:47-49
# The cheapest boat any market will accept, i.e. the tier at which exporting
# becomes available at all.
MIN_EXPORT_BOAT_TIER = min(market["minBoatTier"] for market in EXPORT_MARKETS)
$ grep -rn "MIN_EXPORT_BOAT_TIER" .
src/business/export.py:49:MIN_EXPORT_BOAT_TIER = min(...)
Computed at import and read by nothing. canExport() (src/business/export.py:82) answers the same question a different way, so it is both dead and a second, divergent definition of "can this player export at all".
3. The CLIENT_CSS / CLIENT_JS branches of webUserInterface.__getattr__ — src/ui/webUserInterface.py:122-135
$ grep -rn "CLIENT_CSS\|CLIENT_JS" .
src/ui/webUserInterface.py:123: """Keep HTML_PAGE / CLIENT_CSS / CLIENT_JS readable as module attributes.
src/ui/webUserInterface.py:131: if name == "CLIENT_CSS":
src/ui/webUserInterface.py:133: if name == "CLIENT_JS":
HTML_PAGE genuinely is read (tests/ui/test_webUserInterface.py:153,161,168,177 and tests/web/test_clientParity.py:27,43); the other two are read by nothing. These arrived with #148, so they were dead on delivery — and the docstring's justification ("tests and any other reader still reach them the same way") is false for two of the three names it lists.
Why it matters
Small individually, but each one is a stale copy of a rule that is implemented properly elsewhere, which is the failure mode worth avoiding: fishingCrewCount is exactly the helper someone would reach for when fixing the role-blind dialogue in the issue filed alongside this one, and it would look authoritative. MIN_EXPORT_BOAT_TIER gives a second answer to a question canExport() already answers. Dead code that encodes a rule invites a future caller to trust it.
Suggested fix
Delete all three. For webUserInterface.__getattr__, keep the HTML_PAGE branch and trim the docstring to name only what it actually preserves:
def __getattr__(name):
"""Keep HTML_PAGE readable as a module attribute; the page is built lazily
so a missing web/ directory doesn't break import."""
if name == "HTML_PAGE":
return htmlPage()
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
If fishingCrewCount is wanted after all, the fix is to use it rather than keep it — see the dialogue issue filed alongside this one, where Gilbert's line recomputes a worse version of the same thing.
Filed by Claude during an automated triage pass; claims above were verified against source.
Summary
During a triage pass, three symbols were found with zero references anywhere in
src/,tests/,web/orexamples/.1.
boats.fishingCrewCount()—src/business/boats.py:385-388An orphan of the fleet/roles rework (#139/#140). The rule it encodes now lives in
_runFishingDay/dailyCatch.2.
export.MIN_EXPORT_BOAT_TIER—src/business/export.py:47-49Computed at import and read by nothing.
canExport()(src/business/export.py:82) answers the same question a different way, so it is both dead and a second, divergent definition of "can this player export at all".3. The
CLIENT_CSS/CLIENT_JSbranches ofwebUserInterface.__getattr__—src/ui/webUserInterface.py:122-135HTML_PAGEgenuinely is read (tests/ui/test_webUserInterface.py:153,161,168,177andtests/web/test_clientParity.py:27,43); the other two are read by nothing. These arrived with #148, so they were dead on delivery — and the docstring's justification ("tests and any other reader still reach them the same way") is false for two of the three names it lists.Why it matters
Small individually, but each one is a stale copy of a rule that is implemented properly elsewhere, which is the failure mode worth avoiding:
fishingCrewCountis exactly the helper someone would reach for when fixing the role-blind dialogue in the issue filed alongside this one, and it would look authoritative.MIN_EXPORT_BOAT_TIERgives a second answer to a questioncanExport()already answers. Dead code that encodes a rule invites a future caller to trust it.Suggested fix
Delete all three. For
webUserInterface.__getattr__, keep theHTML_PAGEbranch and trim the docstring to name only what it actually preserves:If
fishingCrewCountis wanted after all, the fix is to use it rather than keep it — see the dialogue issue filed alongside this one, where Gilbert's line recomputes a worse version of the same thing.Filed by Claude during an automated triage pass; claims above were verified against source.