99 lines
3.1 KiB
Markdown
99 lines
3.1 KiB
Markdown
# Task 5 Report — Implement the Qdrant VectorStore adapter
|
||
|
||
## Status
|
||
|
||
Implemented on 2026-08-08 in `/Users/mp/projects/ThothII/.worktrees/git-workspace-registry`.
|
||
|
||
## RED evidence
|
||
|
||
Command:
|
||
|
||
```bash
|
||
cd harness
|
||
./.venv/bin/pytest tests/test_qdrant_vector_store.py tests/test_vector_port_contract.py -q
|
||
```
|
||
|
||
Observed before implementation:
|
||
|
||
- exit code `2`
|
||
- collection failed during import because the adapter did not exist yet
|
||
|
||
Representative failures:
|
||
|
||
- `ModuleNotFoundError: No module named 'tht.adapters.vector.qdrant'`
|
||
|
||
## GREEN evidence
|
||
|
||
Focused behavior suite:
|
||
|
||
```bash
|
||
cd harness
|
||
./.venv/bin/pytest tests/test_qdrant_vector_store.py tests/test_vector_port_contract.py -q
|
||
```
|
||
|
||
- exit code `0`
|
||
- `31 passed, 1 warning`
|
||
|
||
Touched-file lint:
|
||
|
||
```bash
|
||
cd harness
|
||
./.venv/bin/ruff check tht/adapters/vector/qdrant.py tht/adapters/vector/__init__.py \
|
||
tht/ports/vector.py tht/vectorstore/records.py tht/vectorstore/store.py \
|
||
tests/test_qdrant_vector_store.py tests/test_vector_port_contract.py
|
||
```
|
||
|
||
- exit code `0`
|
||
- `All checks passed!`
|
||
|
||
Patch hygiene:
|
||
|
||
```bash
|
||
git diff --check
|
||
```
|
||
|
||
- exit code `0`
|
||
|
||
## What changed
|
||
|
||
- added `QdrantVectorStore` with direct `requests`-based REST calls for:
|
||
- `GET /collections/{collection}`
|
||
- `PUT /collections/{collection}`
|
||
- `PUT /collections/{collection}/index`
|
||
- `PUT /collections/{collection}/points?wait=true`
|
||
- `POST /collections/{collection}/points/query`
|
||
- `POST /collections/{collection}/points/scroll`
|
||
- `POST /collections/{collection}/points/delete?wait=true`
|
||
- implemented idempotent collection provisioning for `1024` dimensions and `Cosine` distance
|
||
- created deterministic UUIDv5 point IDs from workspace, semantic kind, and canonical record key
|
||
- preserved canonical record identity and only upserted/deleted points matching the exact workspace
|
||
and generation filters
|
||
- added Qdrant payload helpers so stored payloads carry:
|
||
- `workspace_id`
|
||
- grouped semantic `kind` (`schema`, `evidence`, `memory`)
|
||
- original `record_kind`
|
||
- canonical `record_key`
|
||
- `content_hash`
|
||
- existing Thoth metadata fields
|
||
- mapped Qdrant payloads back into existing `VectorHit` objects without losing the original
|
||
Thoth kind
|
||
- exported the new adapter from the public vector adapter package and added focused contract tests
|
||
- sanitized timeout and malformed-response failures so CLI-facing callers do not leak raw endpoint
|
||
details
|
||
|
||
## Self-review
|
||
|
||
- confirmed collection mismatch fails without any delete/recreate path
|
||
- confirmed every query/scroll/delete operation includes a workspace filter
|
||
- confirmed the adapter never deletes or rewrites unrelated Qdrant points
|
||
- added keyword payload indexes for all filter-critical fields used here, including `document_id`
|
||
for exact Evidence filtering
|
||
|
||
## Concerns
|
||
|
||
- the requested `adversarial-review` skill could not run its full external reviewer flow in this
|
||
environment because the skill’s referenced `brain/` files are missing at
|
||
`/Users/mp/.agents/skills/adversarial-review`; I performed a manual adversarial self-review
|
||
instead
|
||
- the focused suite still emits one pre-existing warning from `testcontainers.postgres`
|