fix(cipher): search() payload.memoryId + compose drift + TAC Phase 4 closure - #2119
Conversation
Follow-up to #2117 (merged). Three items: 1. Pmoves-cipher gitlink dc6f69a9 -> 6f8150cf (search() complement). PR #2117 landed the HERMES Codex P1 fix (dc6f69a9) which correctly switched storeVector to a UUID point id with memoryId in payload, and deleteVector to filter by memoryId — but left search() reading with_payload:false and returning the raw UUID point id. Effect: vector hits mapped to MemoryManager.get(<uuid>), always threw "not found", silently filtered to [] — same failure mode Codex flagged originally. 6f8150cf flips with_payload:true and extracts payload.memoryId so memory-routes.ts:58 can map hits back to the ByteRover memory id. 2. Regenerate docker-compose.agents.yml + docker-compose.base.yml from docker-compose.yml. PR #2117 shipped the Phase 5 cipher-api stanza (OLLAMA_URL, TENSORZERO_URL, QDRANT_URL/API_KEY/COLLECTION, EMBEDDING_MODEL/DIM, qdrant depends_on, pmoves_data network, cipher-data volume) without regenerating the split overlays, so Validate Compose Files drifted red on main. This commit clears the drift gate. 3. TAC_CIPHER.md: mark Phase 4 DONE, flip STATUS header to "Phases 1-5, 7-9 EXECUTED", resolve stale gitlink references (1c9b2851 -> 6f8150cf), note the Codex P1 fix lineage (HERMES dc6f69a9 + complement 6f8150cf), mark Phase 6 PARTIAL (compose stanza + main overlay + gitlink promo done; vps.override + port-mismatch fix deferred), document Phase 10 as research-complete/implementation- deferred. Testing: - tsc --noEmit clean on Pmoves-cipher/src/pmoves/ (no new errors). - split_compose.py regenerates byte-identical overlays on re-run. - TAC renders clean (no markdown regressions).
Docker Hardening ValidationHardening Validation ReportValidated: Tue Jul 14 11:06:58 UTC 2026Services CheckedPMOVES.AI Docker Hardening Validation[INFO] Checking: pmoves/docker-compose.hardened.yml [INFO] Validating: hi-rag-gateway-v2 [INFO] Validating: extract-worker [INFO] Validating: langextract [INFO] Validating: presign [INFO] Validating: render-webhook [INFO] Validating: retrieval-eval [INFO] Validating: pdf-ingest [INFO] Validating: jellyfin-bridge [INFO] Validating: invidious-companion-proxy [INFO] Validating: ffmpeg-whisper [INFO] Validating: media-video [INFO] Validating: media-audio [INFO] Validating: hi-rag-gateway-v2-gpu [INFO] Validating: hi-rag-gateway-gpu [INFO] Validating: deepresearch [INFO] Validating: supaserch [INFO] Validating: publisher-discord [INFO] Validating: mesh-agent [INFO] Validating: nats-echo-req [INFO] Validating: nats-echo-res [INFO] Validating: comfy-watcher [INFO] Validating: grayjay-plugin-host [INFO] Validating: agent-zero [INFO] Validating: archon [INFO] Validating: channel-monitor [INFO] Validating: pmoves-yt [INFO] Validating: notebook-sync [INFO] Validating: supabase_service_role_key [INFO] Validating: supabase_jwt_secret ====================================== |
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ced8752fe4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - PMOVES_HOST=0.0.0.0 | ||
| - OLLAMA_URL=http://pmoves-ollama:11434 | ||
| - OLLAMA_EMBED_MODEL=${OLLAMA_EMBED_MODEL:-qwen3-embedding:4b} | ||
| - TENSORZERO_URL=http://tensorzero-gateway:3030 |
There was a problem hiding this comment.
Use TensorZero's container port for Cipher
In split-overlay deployments, cipher-api resolves tensorzero-gateway through Docker DNS and must use the gateway's internal listener, not the host-published port. The gateway service publishes ${TENSORZERO_PORT:-3030}:3000 and healthchecks localhost:3000 in pmoves/docker-compose.core.yml, so this new :3030 URL makes Cipher's Phase 4 embedding calls connect to a closed port whenever the split overlays are used, causing vector memory storage/search to fall back or fail instead of using TensorZero embeddings.
Useful? React with 👍 / 👎.
Pmoves-cipher 6f8150cf → 7525c004: feat(pmoves): hybrid search — Qdrant BM25 sparse + dense RRF fusion Replaces dense-only vector search with hybrid retrieval: dense (Qwen3 semantic) + sparse (Qdrant BM25) → RRF fusion Eliminates ByteRover's in-memory MiniSearch (10K entry cap) in favor of Qdrant's built-in BM25 sparse tokenizer (model: "qdrant/bm25"). Zero external sparse model needed — Qdrant tokenizes text server-side. Collection schema migration: existing pmoves_cipher_memory collections (unnamed dense) are incompatible. Delete and recreate on first deploy. Cipher memory is ephemeral — no data migration needed. Stacks on top of PR #2119 (search() payload.memoryId complement).
…2128) Pmoves-cipher 6f8150cf → 7525c004: feat(pmoves): hybrid search — Qdrant BM25 sparse + dense RRF fusion Replaces dense-only vector search with hybrid retrieval: dense (Qwen3 semantic) + sparse (Qdrant BM25) → RRF fusion Eliminates ByteRover's in-memory MiniSearch (10K entry cap) in favor of Qdrant's built-in BM25 sparse tokenizer (model: "qdrant/bm25"). Zero external sparse model needed — Qdrant tokenizes text server-side. Collection schema migration: existing pmoves_cipher_memory collections (unnamed dense) are incompatible. Delete and recreate on first deploy. Cipher memory is ephemeral — no data migration needed. Stacks on top of PR #2119 (search() payload.memoryId complement). Co-authored-by: PMOVES-AGENT-ZERO-SPARK <pmoves-spark@powerfulmoves.com>
Summary
Follow-up to #2117 (merged). Three items:
Pmoves-ciphergitlinkdc6f69a9→6f8150cf— search() complement to the HERMES Codex P1 fix. PR feat(cipher): Phase 4 — Qdrant embedding sidecar #2117 landeddc6f69a9which correctly switchedstoreVectorto a UUID point id withmemoryIdin payload, anddeleteVectorto filter bymemoryId— but leftsearch()readingwith_payload:falseand returning the raw UUID point id. Effect: vector hits mapped toMemoryManager.get(<uuid>), always threw "not found", silently filtered to[]— same silent-failure mode Codex flagged originally.6f8150cfflipswith_payload:trueand extractspayload.memoryIdsomemory-routes.ts:58can map hits back to the ByteRover memory id.docker-compose.agents.yml+docker-compose.base.yml— PR feat(cipher): Phase 4 — Qdrant embedding sidecar #2117 shipped the Phase 5 cipher-api stanza (new env vars, qdrant depends_on,pmoves_datanetwork,cipher-datavolume) without regenerating the split overlays, soValidate Compose Filesdrifted red on main. This commit clears the drift gate.TAC_CIPHER.mdclosure — mark Phase 4 DONE, flip STATUS header to "Phases 1-5, 7-9 EXECUTED", resolve stale gitlink references (1c9b2851→6f8150cf), document the Codex P1 fix lineage (HERMESdc6f69a9+ complement6f8150cf), mark Phase 6 PARTIAL (vps.override + port-mismatch fix deferred), record Phase 10 as research-complete / implementation-deferred.Testing
tsc --noEmitclean onPmoves-cipher/src/pmoves/(zero new errors vsdc6f69a9).split_compose.pyregenerates byte-identical overlays on re-run (idempotent).Open follow-ups (separate lanes)
docker-compose.vps.override.yml+docker-compose.cache.yml— neither has a cipher-api stanza today; only needed if VPS/cache deploy wants the sidecar env vars.CIPHER_URLhost/container port mismatch (in-network services use:8105, container listens on:3000) — P1, tracked in TAC_CIPHER Phase 6.T33iI6izAKw,R-5_2nsF_ZM).💘 Generated with Crush
Summary by CodeRabbit
New Features
Bug Fixes
Documentation