# T020 — Scout placeholder + Settings (datasource)

> Status: `done`
> Completed: 2026-07-09  
> Milestone: `M9`  
> Est. change: `~120 lines`

## Goal

Scout 占位無假成功；Settings 可切 `mock|live`（live 可提示未接）與顯示 mock 帳密說明。

## Depends on

- T006, T007

## Inputs

- Spec §4.7、§4.8

## Outputs

### 程式變更

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/pages/ScoutPage.tsx` | edit | EmptyState 文案 |
| `apps/web/src/pages/SettingsPage.tsx` | edit | datasource toggle |
| storage `harbor.datasource` | edit | |

### 行為變更

- Scout 無 submit 成功操作  
- 切 live 不崩潰（可顯示「尚未接上 API」）

## Out of scope

- 海巡功能

## Acceptance

- [ ] Scout 符合占位  
- [ ] Settings 可切換並重整後仍在  
- [ ] `npm run build` 通過

```bash
cd apps/web && npm run build
```
