Files
microdao-daarion/docs/memory/CUTOVER_CHECKLIST.md
Apple 0c8bef82f4 feat: Add Alateya, Clan, Eonarch agents + fix gateway-router connection
## Agents Added
- Alateya: R&D, biotech, innovations
- Clan (Spirit): Community spirit agent
- Eonarch: Consciousness evolution agent

## Changes
- docker-compose.node1.yml: Added tokens for all 3 new agents
- gateway-bot/http_api.py: Added configs and webhook endpoints
- gateway-bot/clan_prompt.txt: New prompt file
- gateway-bot/eonarch_prompt.txt: New prompt file

## Fixes
- Fixed ROUTER_URL from :9102 to :8000 (internal container port)
- All 9 Telegram agents now working

## Documentation
- Created PROJECT-MASTER-INDEX.md - single entry point
- Added various status documents and scripts

Tokens configured:
- Helion, NUTRA, Agromatrix (existing)
- Alateya, Clan, Eonarch (new)
- Druid, GreenFood, DAARWIZZ (configured)
2026-01-28 06:40:34 -08:00

184 lines
4.4 KiB
Markdown

# Qdrant Canonical Migration - Cutover Checklist
**Status:** GO
**Date:** 2026-01-26
**Risk Level:** Operational (security invariants verified)
---
## Pre-Cutover Verification
### Security Invariants (VERIFIED ✅)
| Invariant | Status |
|-----------|--------|
| `tenant_id` always required | ✅ |
| `agent_ids ⊆ allowed_agent_ids` (or admin) | ✅ |
| Admin default: no private | ✅ |
| Empty `should` → error | ✅ |
| Private only via owner | ✅ |
| Qdrant `match.any` format | ✅ |
---
## Cutover Steps
### 1. Deploy
```bash
# Copy code to NODE1
scp -r services/memory/qdrant/ root@NODE1:/opt/microdao-daarion/services/memory/
scp docs/memory/canonical_collections.yaml root@NODE1:/opt/microdao-daarion/docs/memory/
scp scripts/qdrant_*.py root@NODE1:/opt/microdao-daarion/scripts/
# IMPORTANT: Verify dim/metric in canonical_collections.yaml matches live embedding
# Current: dim=1024, metric=cosine
# Restart service that owns Qdrant reads/writes
docker compose restart memory-service
# OR
systemctl restart memory-service
```
### 2. Migration
```bash
# Dry run - MUST pass before real migration
python3 scripts/qdrant_migrate_to_canonical.py --all --dry-run 2>&1 | tee migration_dry_run.log
# Verify dry run output:
# - Target collection name(s) shown
# - Per-collection counts listed
# - Zero dim/metric mismatches (unless --skip-dim-check used)
# Real migration
python3 scripts/qdrant_migrate_to_canonical.py --all --continue-on-error 2>&1 | tee migration_$(date +%Y%m%d_%H%M%S).log
# Review summary:
# - Collections processed: X/Y
# - Points migrated: N
# - Errors: should be 0 or minimal
```
### 3. Parity Check
```bash
python3 scripts/qdrant_parity_check.py --agents helion,nutra,druid 2>&1 | tee parity_check.log
# Requirements:
# - Count parity within tolerance
# - topK overlap threshold passes
# - Schema validation passes
```
### 4. Dual-Read Window
```bash
# Enable dual-read for validation
export DUAL_READ_OLD=true
# Restart service to pick up env change
docker compose restart memory-service
```
**Validation queries (must pass):**
| Query Type | Expected Result |
|------------|-----------------|
| Agent-only (Helion) | Returns own docs, no other agents |
| Multi-agent (DAARWIZZ) | Returns from allowed agents only |
| Private visibility | Only owner sees private |
```bash
# Run smoke test
python3 scripts/qdrant_smoke_test.py --host localhost
```
### 5. Cutover
```bash
# Disable dual-read
export DUAL_READ_OLD=false
# Ensure no legacy writes
export DUAL_WRITE_OLD=false
# OR remove these env vars entirely
# Restart service
docker compose restart memory-service
# Verify service is healthy
curl -s http://localhost:8000/health
```
### 6. Post-Cutover Guard
```bash
# Keep legacy collections for rollback window (recommended: 7 days)
# DO NOT delete legacy collections yet
# After rollback window (7 days):
# 1. Run one more parity check
python3 scripts/qdrant_parity_check.py --all
# 2. If parity passes, delete legacy collections
# WARNING: This is irreversible
# python3 -c "
# from qdrant_client import QdrantClient
# client = QdrantClient(host='localhost', port=6333)
# legacy = ['helion_docs', 'nutra_messages', ...] # list all legacy
# for col in legacy:
# client.delete_collection(col)
# print(f'Deleted: {col}')
# "
```
---
## Rollback Procedure
If issues arise after cutover:
```bash
# 1. Re-enable dual-read from legacy
export DUAL_READ_OLD=true
export DUAL_WRITE_OLD=true # if needed
# 2. Restart service
docker compose restart memory-service
# 3. Investigate issues
# - Check migration logs
# - Check parity results
# - Review error messages
# 4. If canonical data is corrupted, switch to legacy-only mode:
# (requires code change to bypass canonical reads)
```
---
## Files Reference
| File | Purpose |
|------|---------|
| `services/memory/qdrant/` | Canonical Qdrant module |
| `docs/memory/canonical_collections.yaml` | Collection config |
| `docs/memory/cm_payload_v1.md` | Payload schema docs |
| `scripts/qdrant_migrate_to_canonical.py` | Migration tool |
| `scripts/qdrant_parity_check.py` | Parity verification |
| `scripts/qdrant_smoke_test.py` | Security smoke test |
---
## Sign-off
- [ ] Dry run passed
- [ ] Migration completed
- [ ] Parity check passed
- [ ] Dual-read validation passed
- [ ] Cutover completed
- [ ] Post-cutover health verified
- [ ] Rollback window started (7 days)
- [ ] Legacy collections deleted (after rollback window)