Migration Plan: Promote Upward-Dependent Code from sage-libs to sage-middleware¶
Date: 2026-01-11
Status: ✅ Complete
Core rule: If it needs upward/runtime backends, it is NOT a lib. Promote to middleware.
Compatibility rule: 🚫 No backward compatibility (no re-export shims). Update all call sites.
Progress Summary¶
| Workstream | Status | Notes |
|---|---|---|
| Agent A (Vector DB) | ✅ Complete | Milvus, Chroma, ChromaAdapter moved to sage.middleware.components.vector_stores |
| Agent B (Memory) | ✅ N/A | No issues found - memory backends already in middleware |
| Agent C (Refiner) | ✅ N/A | Context compression already migrated to isage-refiner |
| Agent D (Enforcement) | ✅ Complete | Pre-commit hook libs-middleware-import-check added |
0) Scope and success criteria¶
Inputs¶
- Repo:
intellistream/SAGE(monorepo packages underpackages/) - Policy doc:
cross-layer/MIDDLEWARE_COMPONENT_PROMOTION_POLICY.md
Success criteria¶
- No runtime/backend-dependent code remains under
packages/sage-libs/src/**. packages/sage-libs/src/**contains only interfaces/types/pure algorithms.- All repo imports updated to new
sage.middleware.*locations. - Test gates: unit tests + quick smoke imports pass.
1) Workstream decomposition (run multiple agents in parallel)¶
We’ll run 4 agents in parallel, each owning a bounded refactor set.
Agent A — RAG Retrieval Promotions (Vector DB / indexing) ✅ COMPLETED¶
Goal: Move any retriever/vector-store adapter that touches VDB/FAISS/SageVDB/Milvus to middleware.
Completed actions:
1. Created packages/sage-middleware/src/sage/middleware/components/vector_stores/
2. Moved chroma.py, milvus.py, chroma_adapter.py from sage-libs/integrations/
3. Updated __init__.py exports
4. Updated imports in:
- sage-middleware/operators/rag/retriever.py
- sage-llm-gateway/adapters/openai.py
5. Moved tests to sage-middleware/tests/components/vector_stores/
6. Deleted original files from sage-libs/integrations/
7. Updated sage-libs/integrations/__init__.py (removed vector store exports)
New namespace:
- sage.middleware.components.vector_stores.ChromaBackend
- sage.middleware.components.vector_stores.MilvusBackend
- sage.middleware.components.vector_stores.ChromaVectorStoreAdapter
Verification:
- No sage-libs imports sage.middleware (checked)
- All imports work correctly (tested)
Agent B — Memory Promotions (Neuromem / session memory)¶
Goal: Anything that touches Neuromem, session storage, Redis/RocksDB-like persistence belongs to middleware.
Target namespace:
- sage.middleware.components.memory.* (or consolidate under existing sage_mem if preferred)
Deliverables: - Move memory adapters/services from libs (if any) into middleware components - Ensure gateway/session code imports middleware only - Update tests for memory services
Prompt (copy to agent)
You are refactoring SAGE. Rule: anything that depends on Memory backends (Neuromem/isage-neuromem, Redis/RocksDB, session persistence) must live in
sage-middleware. Task: scanpackages/sage-libs/src/**for memory backends or adapters, move them topackages/sage-middleware/src/sage/middleware/components/memory/**(or existingcomponents/sage_mem/**when appropriate). Constraints: - 🚫 No backward compatibility: do NOT keep old import paths. - Update all call sites. - Remove any libs→middleware dependency. Quality gates: - unit tests for middleware memory services pass.
Agent C — Refiner Promotions (LLMLingua / LongRefiner adapters)¶
Goal: Any refiner/compressor adapter that wraps isage-refiner or similar belongs to middleware.
Target namespace:
- sage.middleware.components.sage_refiner.* (existing)
Deliverables: - Ensure refiner adapters are not in libs - Update call sites and tests
Prompt (copy to agent)
You are refactoring SAGE. Rule: anything that touches Refiners/Compressors (LLMLingua, LongRefiner, isage-refiner) must live in
sage-middleware. Task: locate any refiner adapter code underpackages/sage-libs/src/**, move it intopackages/sage-middleware/src/sage/middleware/components/sage_refiner/**. Constraints: - 🚫 No backward compatibility shims. - Update all call sites. - Keep behavior stable. Quality gates: - middleware refiner tests pass.
Agent D — Dep Graph & Enforcement (import bans + doc updates)¶
Goal: Prevent regression and ensure docs reflect the new policy.
Deliverables:
- Add/extend an architecture check rule (in sage-tools if exists) to fail if sage-libs/src/** imports sage.middleware.
- Update docs-public/docs_src/dev-notes/package-architecture.md to reflect rule (briefly).
- Update any developer docs that instruct old imports.
Prompt (copy to agent)
You are implementing enforcement for SAGE layering rules. Task: 1) Add a repository check that fails CI/dev checks if any file under
packages/sage-libs/src/**importssage.middleware. 2) Update documentation to reflect: "Upward-dependent code must be promoted to middleware; no compat shims". Constraints: - Keep the check fast. - Do not introduce try/except fallback logic.
2) Milestones and ordering¶
Milestone 1 (Day 1)¶
- Land docs + policy (already done)
- Land migration plan (this doc)
- Land empty target folders under
sage-middleware(optional, if needed)
Milestone 2 (Day 2–3)¶
- Agent A/B/C perform code moves + fix imports + update tests
Milestone 3 (Day 3–4)¶
- Agent D adds enforcement check + updates architecture docs
Milestone 4 (Day 5)¶
- Full repo quick test suite + quality checks
- Remove any leftover references to old paths
3) Operational rules for agents¶
- One agent owns one domain; avoid overlapping file edits.
- Prefer mechanical moves + direct import updates.
- If a module is used by both libs and middleware:
- split into
sage-libs(interfaces/types/pure code) +sage-middleware(runtime-backed implementation) - Do NOT add compatibility imports.
4) Quick checklist for PR reviewers¶
- [ ] No new
try/except ImportErrorfallback patterns - [ ] No
sage-libsimportssage.middleware - [ ] No re-export shims for moved modules
- [ ] Dependencies updated in the correct
pyproject.toml - [ ] Unit tests updated and passing