Skip to content

fix: first-run user test findings in setup import, secrets, status pill and profile Try it (Spec fix-usertest-web) - #1473

Merged
github-actions[bot] merged 9 commits into
mainfrom
fix-usertest-web
Oct 2, 2026
Merged

github-actions[bot] merged 9 commits into
mainfrom
fix-usertest-web

Conversation

@Dumbris

@Dumbris Dumbris commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Summary

Fixes four findings from a first-run user test of main (findings F-04, F-05, F-07 and the first-load status journey). They are recorded as tasks in Spec 109 Phase 17 (T172 to T177) and Spec 108 Phase 17 (T153 to T154), with decisions in research D37 (Spec 109) and D40 (Spec 108). No new dependencies, no MCP or CLI golden changes, no generated contract types changed.

Specs: specs/109-ux-navigation-consistency/ (tasks.md Phase 17, research.md D37, quickstart.md, contracts/navigation-map.md and rest-api.md) and specs/108-profiles-v3/ (tasks.md Phase 17, research.md D40).

User-visible changes

REST (F-04, T172)

  • POST /api/v1/servers/import/path?preview=true of a client config that exists but holds no MCP servers (0 bytes, whitespace, {}, no or empty server map) now answers 200 with an empty imported list and the format from the hint, instead of 400. Previously the setup wizard and the detected importer each logged a 400 per empty Claude Code or Claude Desktop file.
  • Unchanged: an apply (preview=false) of such a file, a malformed file, the multipart upload and /import/json still answer 400.
  • New Go names: configimport.ErrTypeNoServers, configimport.IsNoServers, httpapi.emptyImportPreview. Swagger description updated.

Web UI

  • Setup wizard import (F-04, T173). After an import the Servers step shows one completion state: "2 servers imported" (never "No importable servers found" next to it, and no "not selected" skip), then "Approve a server to finish this step. 6 servers are waiting in quarantine, including the 2 you just imported — review their tools before they can run." (the old copy ran the two sentences together as "step.6" and called every quarantined server "imported"). When an import leaves a usable server and nothing else to import, the step shows "N servers imported." with a "Continue to Verify" button instead of the false "Nothing to import" card. The import summary on every Web import surface omits servers the user did not select.
  • Masked secrets (F-07, T174). An env or header value is masked while typing when its field is in Secret mode or its name looks secret-like, in Value mode too. A Show/Hide button reveals it; revealing is display only and never changes the Value/Secret choice or the stored value. Password-manager prompts are opted out.
  • Honest status pill (T175). When servers wait for review the header pill reads "0 online · 4 awaiting review · 0 tools · Retrieve" (with an "offline" count when a server is really down) instead of "0 of 4 online". The compact form keeps 0/4 and carries the full text in its title; between 1100 and 1279 px the routing-mode chip and offline count are hidden while servers await review so the header does not overflow. Before the first server list it reads "Loading servers…", and "Servers unavailable" if that load failed.
  • Profile editor (F-05, T153). Try it renders each hit as server:tool plus description (it printed [object Object] because the panel read a flat item while the API returns {score, tool: {...}}), and says whether it uses your unsaved edits. While the draft differs from the saved profile, the tool counts read "Saved profile: 3 visible · 6 hidden" with a note pointing to Try it.

Not changed

CLI, MCP tools, macOS app (macOS masking and a draft-evaluated effective-tools route are follow-ups), and the files owned by other PRs (ReviewScreen.vue, CatalogSearch.vue, internal/registries/**).

Tests added

  • Go: TestImportFromPath_PreviewEmptyClientConfigIsEmptyNot400, TestImportFromPath_ApplyEmptyClientConfigStill400, TestImportFromPath_PreviewMalformedJSONStill400, TestImportServersJSON_EmptyMcpServersStill400, TestIsNoServers.
  • Vitest: onboarding-servers-step-state, import-servers-completion, onboarding-wizard-import-completion, secret-toggle-masking, status-pill-awaiting-review, profile-try-unsaved; extended add-server-manual, add-server-paste, profile-policy-editor (real nested hit shape) and status-pill (loaded = true fixture line).
  • Playwright: new e2e/web-ui-sweep/usertest-web-fixes.spec.ts at 1440x900 and 900x900 (added to scripts/run-web-smoke.sh); the pill regex in navigation-consistency.spec.ts now accepts the awaiting-review wording.
  • Spec traceability: acceptance-index.json (US5-5, US6-2, US7-4) and parity-matrix.json (Spec 109 row 17, Spec 108 row 6) reference the new tests.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Deploying mcpproxy-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: 2df8fd0
Status: ✅  Deploy successful!
Preview URL: https://31f4d1fb.mcpproxy-docs.pages.dev
Branch Preview URL: https://fix-usertest-web.mcpproxy-docs.pages.dev

View logs

F2.1: ImportServers gains a show-message prop; the wizard suppresses the
importer's own imported line while its servers-import-done card shows, so
the Servers step has one completion state.

F3.1: ManualServerForm env/header rows get a stable id used as the v-for
key, so removing an earlier row no longer hands its SecretToggle (and its
revealed flag) to the next row.
@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

📦 Build Artifacts

Workflow Run: View Run
Branch: fix-usertest-web

Available Artifacts

  • archive-darwin-amd64 (31 MB)
  • archive-darwin-arm64 (28 MB)
  • archive-linux-amd64 (19 MB)
  • archive-linux-arm64 (17 MB)
  • archive-windows-amd64 (31 MB)
  • archive-windows-arm64 (27 MB)
  • frontend-dist-pr (0 MB)
  • installer-dmg-darwin-amd64 (27 MB)
  • installer-dmg-darwin-arm64 (24 MB)
  • smart-mcp-proxymcpproxy-goX62Z1D.dockerbuild (0 MB)

How to Download

Option 1: GitHub Web UI (easiest)

  1. Go to the workflow run page linked above
  2. Scroll to the bottom "Artifacts" section
  3. Click on the artifact you want to download

Option 2: GitHub CLI

gh run download 37070904376 --repo smart-mcp-proxy/mcpproxy-go

Note: Artifacts expire in 14 days.

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved (Model B): Paperclip review verdicts = ACCEPT and qa-gate green at this head SHA. Arming auto-merge; GitHub merges when all required checks pass.

@github-actions
github-actions Bot merged commit a348403 into main Oct 2, 2026
73 of 75 checks passed
github-actions Bot pushed a commit that referenced this pull request Oct 3, 2026
…le reach (#1482)

Docs, changelog and verified fixes from a first-run, upgrade and
user-test pass on `main` (335477e).

## Docs
- `docs/features/profiles.md`: profiles are optional. Without an
effective profile, no profile-level restriction applies (a scoped
credential's own grant still does). The quick start is presented as
being for scoped access.
- `docs/configuration.md` (`quarantined` row): explains the real
default. A server added through the UI, CLI or API follows its trust
mode. A first-seen config-file server with no `quarantined` key and no
`config.db` record is held for review. An explicit value wins, and a
recorded server keeps its state. Links to the admission rules.
- `docs/features/security-quarantine.md`: the hand-editing section names
the extra conditions: quarantine is enabled, and the trust mode is not
`auto` (including legacy `auto_approve_tool_changes`/`skip_quarantine`
resolving to `auto`), matching `ServerConfig.EffectiveTrustMode`.
- `docs/getting-started/quick-start.mdx`: a plain note that a server
added by editing the file is held for review until approved.
- `CHANGELOG.md`: the security, review, catalog, telemetry, CLI and
first-run fixes merged since v0.69.0 (#1463, #1467–#1473, #1481) plus
this PR's.

## Fixes (each reproduced in an isolated instance, regression test fails
on main)
- **Upgrade start advisory repeated.** `reportPreFixAdmissions` ran on
every gate pass (initial gate, `LoadConfiguredServers`, every publish),
so an upgrade start logged the "predate the config-load admission gate"
advisory 2–5 times. It is now reported once per server per process. Gate
decisions are unchanged.
- **Benign startup race logged as ERROR.** Both the supervisor reconcile
and `LoadConfiguredServers` → `AddServer` asked a not-yet-ready client
to connect. The second call was correctly refused with "connection
already in progress or established (state: Connecting)" but logged at
ERROR, and server identity registration was skipped. A new
`managed.ErrConnectAlreadyActive` sentinel (same message text) lets
`AddServer` treat it as success at debug level.
- **`set_profile` under-reported a switchable client's reach.** After a
successful switch, `resolveEffectiveProfileForJustSetSlug` treated the
client binding as authoritative and reported the binding's servers
instead of the selected profile's.

## Verification
- Cross-model review: codex gpt-6.1-sol, chunked. Three low findings:
two doc-wording findings are applied, and the third (the per-process
advisory set is never cleared) is a deliberate trade-off.
- Live re-verification on isolated instances: each symptom was
reproduced on a main build and is gone on this branch. The upgrade case
was run over a v0.52.1 data dir.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants