Cross-collection memory tier
Adds memory.global_collection: str | None to the memory config. When set, retrieval opens a second Qdrant collection alongside the primary per-session/per-project one, and merges its candidates into the same pre-fusion pool — before the existing RRF fuse, temporal-decay, domain-boost, guaranteed-slot reservation, and MMR pipeline runs. That pipeline still computes its top_k budget once, over one merged pool, exactly as before.
Fully additive and backward compatible:
global_collectiondefaults toNone— unset configs are byte-identical to prior behavior.build_memory_store's single-store return contract is untouched (used byreplay,inspect-memory,memory show/list/diff, the MCP server, ingest, and benchmarks) — the second store is constructed only inside the retrieval path itself.- Any failure opening or querying the global store (unreachable Qdrant, missing collection) degrades cleanly to primary-only results and is logged — never raised.
866 → 871 tests, 5 new (merge respects top_k without inflating guaranteed-slot counts; empty/unreachable global store degrades cleanly; existing single-store configs stay byte-identical), zero regressions.
This is the seam a multi-project deployment can use to give every agent run access to lessons learned anywhere, not just within its own session or project history.