> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Display Tencent realtime A-share prices in the holdings table and account summary after a manual quote refresh.
**Architecture:** Add a focused market quote client that parses Tencent responses and returns typed quote snapshots. Keep quotes in `TradingService` as an in-memory cache, then pass quote prices into the existing pure position calculations so GUI display updates without writing realtime prices into SQLite.
Add a calculation test where a `QuoteSnapshot(price=Decimal("10"))` is passed, and `PositionSummary.current_price` becomes `10` with `price_source == "tencent"`.
Expected: FAIL because `QuoteSnapshot` and service quote cache are not implemented.
- [ ]**Step 3: Implement quote snapshot flow**
Add `QuoteSnapshot` to models. Add `quote_snapshots` argument to `calculate_positions`. Add `quote_provider` injection, `_quote_cache`, and `refresh_quotes` to `TradingService`.
git commit -m "feat: use realtime quotes in summaries"
```
### Task 3: GUI Refresh Wiring
**Files:**
- Modify: `src/grid_trading/ui/main_window.py`
- Test: `tests/test_ui.py`
- [ ]**Step 1: Update GUI smoke expectation**
Extend the existing main window smoke test to assert a refresh button exists with text containing `行情`.
- [ ]**Step 2: Run UI test and verify it fails**
Run: `pytest tests/test_ui.py -v`
Expected: FAIL because the toolbar still uses the old generic refresh text.
- [ ]**Step 3: Implement GUI quote refresh**
Change the toolbar button to `刷新行情`. Wire it to call `service.refresh_quotes()` before `refresh_all()`. Keep post-save refreshes as local recalculation without forcing network calls.