# TODO Live state as of 2026-09-10. Everything not listed here is deployed and green. ## Open - [ ] **Basic index has no reader.** `MilvusVectorStore.search()` exists now, but no tool calls it. Decide where the query path lives: put pymilvus into the deliberately-lean `nextcloud-basic-mcp` server image, or expose a query API from the indexer container. Nothing can read that index until this is done. Source: `/home/danvics/docker/nextcloud-basic-mcp` - [ ] **Multi-collection, ped-ai half.** The MCP side is deployed (`clinical_semantic_search(collection=…)` + `clinical_list_collections`, allowlisted by `MILVUS_COLLECTIONS`). ped-ai still searches one collection per request. Needs an admin setting for which collections to search, then fan-out and merge — `dedupeSources` in `src/utils/clinicalRetrieval.js` already merges and renumbers. See `clinical-assist/COLLECTIONS.md`. - [ ] **Confirm mail indexing end to end.** Six separate breaks are fixed and the scan now reaches mail, but the file pass has not finished a full cycle since the Milvus rebuild, so no mail has been indexed yet. Watch for `[SCAN-*] Mail messages: N seen, M queued`. - [ ] **Put ped-ai-storage under version control.** It holds the compose, `check.py` and `bootstrap_basic.py` for a live stack and is not a git repo, so changes there are unreviewable and unrecoverable. - [ ] **Rebuild the operator image.** Its baked-in `/opt/storage/check.py` has drifted from the host copy: it lacks the `s3:ListBucket` grant (dropping it broke image generation on 2026-09-09) and still resolves the store as `clinical-milvus`. The compose mounts the host copy over it as a stopgap; rebuilding makes that mount unnecessary. - [ ] **Apply the restored clinical vector-store compose.** Written, committed and validated at `/home/danvics/docker/nextcloud-mcp-server`, deliberately NOT applied — `up -d` recreates the live clinical Milvus. Owner's call when. ## Worth knowing - **Four repos were rescued from container images today**: `nextcloud-basic-mcp`, `clinical-assist`, the deleted `nextcloud-mcp-server` compose file, and the operator's `check.py` drift. Prefer building from a repo over a live container. - **Two Milvus instances, historically misleading names.** Clinical index = `nextcloud-mcp-server-milvus-1` (MinIO-backed, collection `mcp_bge_m3_1024`). Nextcloud basic index = `ped-ai-storage-basic-milvus-1` (db `basic`, collection `basic_bge_m3_1024_v2`). - **Embedded etcd is unusable with authorization on.** Every non-root Milvus user failed `etcdserver: invalid auth token`. Both stores now run a separate etcd container, matching the profile that always worked. - **Both Milvus stores now keep objects in MinIO**, matching what clinical always did. `COMMON_STORAGETYPE=local` wrote segment files relative to the working directory, so a recreate destroyed them while etcd kept referencing them and the collection hung at Loading forever. S3 semantics also mean either store can be pointed at a managed bucket without touching Milvus — which is what makes a Terraform-managed deployment straightforward. - **Milvus object-store credentials live in `milvus-user.yaml`** in the protected secrets dir, not in the compose, because Milvus has no file-based option for them and the compose should stay reviewable. Co-Authored-By: Claude Opus 5