feat(mcp): serve the reference tables from gw1://meta - #39
Merged
Conversation
The resource served _meta.json alone, while the README promised professions, attribute lines, campaigns and skill types — and, worse, UNKNOWN_ATTRIBUTE told the caller to enumerate title tracks there. That pointer was a dead end in an LLM-facing error, which is the reason to enrich rather than trim the prose: a model that typo'd an attribute name gets suggestions, but nothing to enumerate from. The payload is composed at module scope (a resource read must not rebuild it, same rule as the tool schema literals) from the gw-data tables. Deliberately NOT written into _meta.json: that file is one key per generator, and composing tables into it would create an unmanaged copy with no generator. Two prose fixes from the same audit pass: - /privacy claimed "no personal data is collected" absolutely while recording a CALLER-CONTROLLED client name. The blob stays — it is what showed 63% of traffic was one uptime monitor — but the absolute claim goes, replaced by naming who supplies the value, its bounds, and the fact that Analytics Engine has no per-row deletion. - README now says /exportaccount copies your character name, since the same paragraph tells you to paste the JSON into a conversation.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #39 +/- ##
==========================================
+ Coverage 87.46% 87.48% +0.01%
==========================================
Files 16 16
Lines 766 767 +1
Branches 227 227
==========================================
+ Hits 670 671 +1
Misses 8 8
Partials 88 88 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Triage of a fourth external audit (ChatGPT, 2026-08-11 — snapshot without
.git, no npm access, so it never ran the suite). It rated the repo 7.4/10 and raised three "P1"s; one was real, and its sharpest form was not the one reported.The real finding
gw1://metaserved_meta.jsonalone. The README promised four reference tables, but the load-bearing version is thatUNKNOWN_ATTRIBUTEtells the caller "Title tracks and each profession's attribute lines are listed in the gw1://meta resource" — a dead pointer inside an LLM-facing error, which defeats the one-round-trip self-correction the project designs for. So: enrich, don't trim the prose._meta.json: one key per generator, so composing tables in would be an unmanaged copy with no generator and no refresh path.title/descriptionwere updated too — they ship inresources/list, and enriching the payload alone would just move the bug one layer over.outputSchemaand are not intools/list, so this costs zero fixed context.Two prose fixes
/privacyclaimed "no personal data is collected" absolutely while recording a caller-controlled client name. The blob stays (it is what showed 63% of traffic was one uptime monitor); the absolute claim goes, replaced by naming who supplies the value, its bounds (charset-restricted, 64 chars, no version), and that Analytics Engine has no per-row deletion./exportaccountcopies your character name — said in the paragraph that tells you to paste the JSON into a conversation.Rejected, with reasons recorded in CLAUDE.md
pnpm --filter @gw1-mcp/gw-data updateis broken, no such script" — false:updateis a pnpm builtin (verified on 11.11.0). The command is correct.assertCoherentSnapshot, the growth gate (no longer fail-open) and the golden fixtures; the guessed-threshold successor was measured and rejected.Verification
pnpm -r typecheck, 376 tests (107 / 79 / 118 / 72),pnpm lint,pnpm fmt:check— all green. New assertions:gw1://metamust carry each of the four tables, and/privacymust not regrow the absolute claim.Method note worth keeping: this pass never ran the suite, so its strongest claims were about prose consistency — and that is exactly where its one real finding was.
🤖 Generated with Claude Code