## 1. Server Card Interaction Fix - [x] 1.1 Replace the `
` runtime action stack with a compact overlay that is anchored to the trigger and does not reflow the card. - [x] 1.2 Close the overlay on outside click, Escape, and action selection. - [x] 1.3 Keep runtime action dispatch semantics unchanged. - [x] 1.4 Show a runtime task progress dialog after action selection with staged progress, logs, and terminal success/failure state. - [x] 1.5 Reuse the same progress dialog from server detail runtime distribution actions. ## 2. Server Card Readability Fix - [x] 2.1 Strengthen `.server-card-stat` label/value contrast for 玩家, TPS, 延迟, 任务, and placeholder values. - [x] 2.2 Preserve the shared black-mecha / magical-girl console visual system and uploaded-background readability. - [x] 2.3 Remove misleading whole-card click affordance while keeping explicit detail/menu controls. ## 3. Verification - [x] 3.1 Run focused frontend tests and typecheck. - [x] 3.2 Run `scripts/check-structure.sh`. - [x] 3.3 Run `openspec validate fix-server-card-action-menu --strict`. - [ ] 3.4 Browser-walkthrough 服务器管理 and verify the menu is compact, card stats are readable, action selection opens the progress dialog, and no metrics/progress/status are covered. ## Evidence - `npm run typecheck` passed. - `npm test -- ConsolePages.test.tsx ServerDetailPage.test.tsx base-css.test.js` passed with 22 tests. - `npm test` passed with 68 tests. - `npm run build` passed. - `go test ./api ./service -run 'Test.*(Run|Distribution|Artifact|ClientManager|Runtime)' -count=1` passed from `platform/`, proving backend run distribution, artifact download, update, and client-manager paths are implemented. - `scripts/check-structure.sh` passed with `structure check passed`. - `openspec validate fix-server-card-action-menu --strict` passed. OpenSpec telemetry flush failed with `ENOTFOUND edge.openspec.dev`, which did not affect validation. - Browser walkthrough is still pending because the Browser plugin reported no available browser backends (`agent.browsers.list()` returned `[]`).