feat(cipher): Phase 4 — Qdrant embedding sidecar - #2117
Conversation
Pmoves-cipher 325b2b90 → 1b5040eb: feat(pmoves): Phase 4 — Qdrant embedding sidecar Embedding sidecar adds semantic vector search to the cipher shim: - TensorZero embed via qwen3_embedding_4b_local (2560d) - Qdrant collection pmoves_cipher_memory (2560d, Cosine) - Fail-open: memory ops never fail if TensorZero/Qdrant down - Vector search on /api/memory/search + MCP tools, lexical fallback Smoke-tested in fail-open mode (3/3 contracts green). tsc zero errors. 754 LOC total across src/pmoves/ (8 files). 💘 Generated with Crush Assisted-by: GLM-5.2 via Crush <crush@charm.land>
|
Warning Review limit reached
Next review available in: 30 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThe ChangesPmoves-cipher update
Estimated code review effort: 1 (Trivial) | ~2 minutes Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ 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.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Pmoves-cipher`:
- Line 1: Update the deployment documentation in TAC_CIPHER.md to replace the
stale gitlink 1c9b2851 with the current 1b5040eb... commit and document the
PMOVES.AI-Edition-Hardened branch specified by .gitmodules, preserving the
existing status format.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 86b99220-dc5b-471a-b000-d4938c7c06e3
📒 Files selected for processing (1)
Pmoves-cipher
There was a problem hiding this comment.
💡 Codex Review
https://github.com/POWERFULMOVES/PMOVES.AI/blob/78d0b69d7375db5075768b22a9419e1163b8feb5/Pmoves-cipher/src/pmoves/embedding.ts#L127
Use a Qdrant-compatible point id
When embeddings are enabled, MemoryManager.create() generates 12-character nanoid memory ids, but Qdrant point ids must be unsigned integers or UUID strings, so using the memory id directly here makes every upsert fail with a 400 response in real Qdrant deployments. Because the fetch response is not checked, /api/memory still returns a non-null embedding_id, but the vector is never stored and semantic search silently falls back or returns no vector hits; store a UUID point id and keep the memory id in payload, or otherwise translate to a valid Qdrant id.
ℹ️ 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-cipher 1b5040eb → e8843482: feat(pmoves): Phase 5 — A2A discovery, Ollama fallback, integration dossier Phase 5 (3 remaining PMOVES features) COMPLETE: ✅ A2A discovery: /.well-known/agent.json with Bearer auth ✅ Ollama embedding fallback: TensorZero → Ollama → fail-open ✅ Integration dossier: PMOVES.AI_INTEGRATION.md v2.0 ✅ Build fixes: OBSOLETE (verified, closed) Compose: added OLLAMA_URL, TENSORZERO_URL, QDRANT_URL, QDRANT_API_KEY, EMBEDDING_MODEL, EMBEDDING_DIM env vars to cipher-api stanza. Added qdrant depends_on + pmoves_data network. TAC Phase 5 marked DONE. Shim total: 856 LOC across 9 files. All 10 phases documented. A1-Shim execution COMPLETE pending PR merge. 💘 Generated with Crush Assisted-by: GLM-5.2 via Crush <crush@charm.land>
Docker Hardening ValidationHardening Validation ReportValidated: Tue Jul 14 09:44:21 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 ====================================== |
CodeRabbit (minor): - TAC_CIPHER.md: update stale gitlink (1c9b2851 → e8843482) - TAC_CIPHER.md: mark fleet rule violations as resolved (PR #2116) - TAC_CIPHER.md: update fleet rule status to COMPLIANT Codex P1 (critical): - embedding.ts: Qdrant point IDs must be UUID or unsigned int, not 12-char nanoid. Generate UUID for point id, store memoryId in payload. Delete by payload filter instead of point id. (submodule commit dc6f69a9 on PMOVES.AI-Edition-Hardened) CHIT-signed: ACK::HERMES-AGENT-GLM::CIPHER-2117-REVIEW-FIXES
Docker Hardening ValidationHardening Validation ReportValidated: Tue Jul 14 09:57:55 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 ====================================== |
Summary
src/pmoves/embedding.ts(183 LOC): embed via TensorZeroqwen3_embedding_4b_local(2560d), store/search/delete in Qdrantpmoves_cipher_memorycollectionmemory-routes.ts) and MCP tools (mcp-sse.ts)How it works
Config (all have defaults)
TENSORZERO_URL— defaulthttp://tensorzero-gateway:3030QDRANT_URL— defaulthttp://qdrant:6333QDRANT_COLLECTION— defaultpmoves_cipher_memoryEMBEDDING_MODEL— defaulttensorzero::embedding_model_name::qwen3_embedding_4b_localEMBEDDING_DIM— default2560Test plan
💘 Generated with Crush
Summary by CodeRabbit