+
+```
+
+**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 `