Skip to content

fix(quarantine): server admission stays human under the default trust tier - #1802

Merged
Dumbris merged 3 commits into
mainfrom
fix/default-tier-server-admission-manual
Oct 30, 2026
Merged

Dumbris merged 3 commits into
mainfrom
fix/default-tier-server-admission-manual

Conversation

@Dumbris

@Dumbris Dumbris commented Oct 30, 2026

Copy link
Copy Markdown
Member

Summary

Since #1740 (Spec 119) made scan the default trust mode, the Spec 086 clean-scan admission gate has been releasing every server added without a trust_mode, including one added with quarantined: true. TestE2E_QuarantineConfigApply has failed on main since then (bisected to #1740).

Maintainer decision: server admission stays human. Only an explicit trust_mode: "scan" auto-admits; the default tier only auto-approves clean tool changes.

  • ServerConfig.AdmitsOnCleanScan() is true only for an explicit trust_mode: "scan".
  • maybeAutoApproveScanSettled, maybeStartAdmissionScan and scanModeAdmissionOwns use it. Default-tier servers get the informational (non-gating) baseline scan instead of the admission one.
  • The approval commit re-checks AdmitsOnCleanScan (and that the server is still quarantined) for scan-auto approvals inside the same commit, so a trust_mode changed while the scan was running cannot release the server.
  • Web UI: the manual add form sends trust_mode only when one is picked. The selector checks no radio for an unset mode (Scan keeps the "current default" badge), so Scan can be chosen explicitly. Previously the form always sent scan.
  • Docs (intro.md, configuration.md, security-quarantine.md), CLI --trust-mode help and the CHANGELOG Spec 119 entry describe the rule.

Tests

  • New: default-tier server is never auto-approved and gets no admission scan (scan_admission_test.go); scanModeAdmissionOwns hands it to the informational path; TestCommitServerApproval_ScanAutoRequiresExplicitScan (manual and unset refused, explicit scan released). Each fails without the fix.
  • Frontend: explicit Scan is sent when picked; unset form omits trust_mode; selector emits scan from the unset state.
  • Locally: internal/server (server tag, CI skip regex), internal/runtime, internal/config, cmd/..., internal/qapilot/..., httpapi; TestE2E_QuarantineConfigApply passes again; ./scripts/test-api-e2e.sh all passed; vitest 2791 passed (the 2 activity-views.spec.ts failures also fail on main locally); vue-tsc; both golangci-lint configs report 0 new issues.
  • Cross-reviewed with opencode Sol 6.1: round 1 found the commit-time race and the add-form opt-in gap (both fixed), round 2 CLEAN.

… tier

Spec 119 made scan the default trust mode, so the spec 086 clean-scan
admission gate began releasing every server added without a trust_mode
(TestE2E_QuarantineConfigApply has failed on main since #1740). Server
release is meant to stay with a person.

- ServerConfig.AdmitsOnCleanScan: only an explicit trust_mode "scan" lets
  a clean admission scan unquarantine a server. The default tier still
  auto-approves clean tool changes.
- maybeAutoApproveScanSettled, maybeStartAdmissionScan and
  scanModeAdmissionOwns use it; default-tier servers get the
  informational (non-gating) baseline scan instead.
- The approval commit re-checks AdmitsOnCleanScan for scan-auto approvals
  under the commit lock, so a trust_mode changed mid-scan cannot release
  the server.
- Web UI: the add form sends trust_mode only when one is picked, and the
  selector checks no radio for an unset mode so Scan can be chosen
  explicitly.
- Docs, CLI help and CHANGELOG describe the admission rule.
@cloudflare-workers-and-pages

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

Copy link
Copy Markdown

Deploying mcpproxy-docs with  Cloudflare Pages  Cloudflare Pages

Latest commit: 91d1d36
Status: ✅  Deploy successful!
Preview URL: https://3cba59bb.mcpproxy-docs.pages.dev
Branch Preview URL: https://fix-default-tier-server-admi.mcpproxy-docs.pages.dev

View logs

@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

❌ Patch coverage is 80.00000% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/config/config.go 0.00% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

…xKeepCreatingHomeConfig

Windows CI failed TempDir's RemoveAll on the former cwd ("being used by
another process") twice on #1802.
@github-actions

Copy link
Copy Markdown
Contributor

📦 Build Artifacts

Workflow Run: View Run
Branch: fix/default-tier-server-admission-manual

Available Artifacts

  • archive-darwin-amd64 (32 MB)
  • archive-darwin-arm64 (29 MB)
  • archive-linux-amd64 (20 MB)
  • archive-linux-arm64 (18 MB)
  • archive-windows-amd64 (32 MB)
  • archive-windows-arm64 (28 MB)
  • frontend-dist-pr (0 MB)
  • installer-dmg-darwin-amd64 (28 MB)
  • installer-dmg-darwin-arm64 (25 MB)
  • smart-mcp-proxymcpproxy-goJ7PQRC.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 41064835875 --repo smart-mcp-proxy/mcpproxy-go

Note: Artifacts expire in 14 days.

@Dumbris
Dumbris enabled auto-merge (squash) October 30, 2026 14:01
@Dumbris
Dumbris merged commit 0719fae into main Oct 30, 2026
50 checks passed
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