```
**Data fetch pattern** (AdminUsersTab.vue script — onMounted with local ref state, no store):
```javascript
import { ref, onMounted } from 'vue'
import * as api from '../../api/client.js'
const loading = ref(false)
const error = ref(null)
const overview = ref(null)
onMounted(async () => {
loading.value = true
try {
overview.value = await api.getAdminOverview()
} catch (e) {
error.value = e.message || 'Failed to load overview'
} finally {
loading.value = false
}
})
```
**No Pinia store** — single-fetch component consistent with all existing admin tab components (confirmed by RESEARCH.md open question 2 answer).
**Response shape to expect** (from RESEARCH.md Pattern 6):
```
{ user_count, total_storage_bytes, doc_status: { processing, ready, failed }, recent_audit: [...] }
```
**Stat card pattern** (use same border/rounded/bg pattern as AdminUsersTab.vue's create-user panel, line 4):
```vue
```
**Audit table headers pattern** (copy from AuditLogTab.vue table header pattern for `recent_audit` rows).
---
### `frontend/src/views/admin/AdminUsersView.vue` (view, CRUD)
**Analog:** `frontend/src/components/admin/AdminUsersTab.vue` — this IS the source file, promoted to a view.
**Extraction rule** (RESEARCH.md Pattern 4): The tab component's top element is `
` with no padding. Copy entire file content. Rename component name in `