fix(mcp,#240): delete the unfixable version read; guard the domain - #264
Merged
Conversation
The mobile half of #240 — no desktop change needed. **`version` is deleted, not filed as a projection gap.** `mcpView` read `readString(r.version, '')`, but no `version` exists in `McpServer` or anywhere on the wire — and unlike a missing projection, none *can* exist, because there is no version string to project. So `McpServerVM.version` was permanently null and `installTag`'s version branch was unreachable: every installed server showed the bare "installed" literal. Removed the field, the read, and the dead branch. The test that asserted the VM "carries a version through when present" is replaced by one asserting it does NOT, even when a payload invents one. **`builtin` is KEPT, and that is a deliberate asymmetry with #239.** The automations `Hook.builtin` was deleted because it can never exist — `Hook` is exclusively user-authored config. `McpCard.builtin` is the opposite: it can and should exist, and the payload already carries the built-in ids in `installedIds` in a form nothing can use. The fix is `withBuiltins(input.servers)` in the same builder. Until then `builtins` is empty and the "Built-in tools" section does not render — honest rather than dead, since it is one desktop field away from live. **MCP install/update STATUS (`McpStat`) is out of scope for the mirror — a decision, not a follow-up.** It is Tauri-invoke-derived, name-keyed, ephemeral, and only defined for downloadable first-party servers. It does not belong in a store projection. **Harness:** `mcp` moves from `PENDING_DOMAINS` into `DECODERS` — Layer A re-encode plus Layer B asserting both install states resolve (neither falls back to `unknown`), the stdio server has no url and the http one does, and that `builtins` is still empty. That last assertion is written to FAIL the day the desktop starts shipping built-ins, so the mobile section gets switched on rather than silently staying empty. Pending domains: 3 → 2 (`components` #241, `blueprints` #236). ## Still open desktop-side (tracked on #240) `McpCard` needs `builtin?: boolean` and `buildMcpPayload` needs `withBuiltins(input.servers)`, preserving the case-insensitive name-shadowing rule so a user server named Research does not render twice. Two always-enabled, always-installed servers are currently invisible to the phone, so the tool inventory it shows is incomplete. Stacked on the #239 branch (PR #263) because both edit the same harness file; this diff reduces to the mcp commit alone once #263 merges. Gates: `npx tsc --noEmit` clean; 532 tests pass. Refs #240 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RAPZC6xEyCrH9qSKUKLQdy
kevinthelago
force-pushed
the
240-mcp-version-read
branch
from
July 29, 2026 06:39
f8c810e to
490beaf
Compare
📦 Preview build readyArtifact: Built from commit 6b44d23 |
11 tasks
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.
The mobile half of #240 — needs no desktop change. Part of #234.
versionis deleted, not filed as a projection gapmcpViewreadreadString(r.version, ''). But noversionexists inMcpServeror anywhere on the wire — and none can, because there is no version string to project. That makes it categorically different from a missing projection: unfixable desktop-side.Consequences:
McpServerVM.versionwas permanentlynull, soinstallTag's version branch was unreachable and every installed server rendered the bareinstalledliteral.Removed the field, the read, and the dead branch. The test asserting the VM "carries a version through when present" is replaced by one asserting it does not, even when a payload invents one.
builtinis KEPT — a deliberate asymmetry with #239Hook.builtin(#239)Hookis exclusively user-authored configMcpCard.builtin(here)installedIdsin a form nothing can use, so the fix iswithBuiltins(input.servers)in the same builderUntil that lands,
builtinsis empty and the "Built-in tools" section does not render. That is honest rather than dead: the section is one desktop field away from live, and this decoder needs no change when it arrives.A decision, not a follow-up
MCP install/update status (
McpStat) is out of scope for the mirror. It is Tauri-invoke-derived, name-keyed, ephemeral, and only defined for downloadable first-party servers. It does not belong in a store projection. Recording that here so it is not re-raised as a gap.Harness
mcpmoves fromPENDING_DOMAINSintoDECODERS— Layer A strict re-encode, plus Layer B asserting both install states resolve (neither falls back tounknown), the stdio server has no url while the http one does, and thatbuiltinsis still empty.That last assertion is deliberately written to fail the day the desktop starts shipping built-ins, so the mobile section gets switched on rather than silently staying empty.
Pending domains: 3 → 2 — only
components(#241) andblueprints(#236) remain, and both are desktop-side or stale.Still open desktop-side
McpCardneedsbuiltin?: boolean, andbuildMcpPayloadneedswithBuiltins(input.servers)— preserving the case-insensitive name-shadowing rule, or mobile renders a duplicate when a user server is named Research. Two always-enabled, always-installed servers are invisible to the phone today, so the tool inventory it shows is incomplete. #240 stays open for that.Gate
npx tsc --noEmitclean.Layer A: mcp payload round-trips through the mobile model.🤖 Generated with Claude Code
https://claude.ai/code/session_01RAPZC6xEyCrH9qSKUKLQdy