PASS US1 + US2 — Tri-state listing (denied / malformed / unknown / connected / absent)
Expected
- access_state=denied (Claude Code): a 'Blocked' badge AND an actionable remediation banner naming the cause and the exact `tccutil reset SystemPolicyAppData com.smartmcpproxy.mcpproxy` command, with a Copy button.
- access_state=malformed (Cursor): a distinct 'Unreadable config' badge — NOT a denial banner.
- access_state=unknown, installed (Codex): neutral — a 'Connect' action plus an explicit 'Check access' affordance; no eager content read, no banner.
- content-resolved connected (OpenCode): a 'Disconnect' button.
- absent (VS Code): 'Config not found'.
Observed
All five outcomes render distinctly. The denied row shows the blocked badge + remediation banner (full tccutil command) + Copy/Re-check; malformed shows its own badge; the unknown row stays neutral with a Check-access link; connected shows Disconnect; absent shows Config not found.
01-tristate-listing.png
PASS US2 — One-click copy of the reset command
Expected
- Clicking 'Copy reset command' writes exactly `tccutil reset SystemPolicyAppData com.smartmcpproxy.mcpproxy` to the clipboard and the button confirms with 'Copied ✓'.
Observed
Clipboard content asserted equal to the exact tccutil command; button label flips to 'Copied ✓'.
02-copied-command.png
PASS US1 — Explicit 'Check access' resolves an unknown client on demand
Expected
- Initially one denial banner (the pre-denied Claude Code row); the Codex row is neutral (unknown).
- Clicking 'Check access' on Codex calls the per-client GET (the only content-read endpoint, scoped to the user action) and, when it returns denied, surfaces a second remediation banner — without a full connect attempt.
Observed
Banner count goes 1 → 2 after the explicit Check-access click; the newly resolved denial renders its own remediation banner.
03-check-access-resolves-denied.png