docs: update M3.8 task specs (M3.8.3-6 detailed)
M3.8.3 ✅ COMPLETE (7 tests) - MetricsCollector: per-project aggregation - Structured logging (tracing) - Prometheus export format M3.8.4 ✅ IMPLICIT (no work needed) - Query path already clean (no compression) - Only cache_metrics() uses optimizer (for observability) M3.8.5 ⏳ ACTIVE (16 tests spec'd) - Compression ratio benchmarks (5 tests: log/json/text/diff/mixed) - Search quality validation (8 tests: pgvector/opensearch/fusion) - Performance baseline (3 tests: latency/throughput/memory) M3.8.6 ⏳ PENDING (13 gate assertions) - Safety (6): no data loss, deterministic, structure preservation - Performance (4): latency p99 <3ms, throughput 1000+/sec, memory <100MB - Quality (3): compression targets, search improvement, cache accuracy Project progress: 64/78 complete (82%), 8/13 gates green Total M3.8 tests: 103 (62+5+7+0+16+13)
This commit is contained in:
+48
-57
@@ -1,75 +1,66 @@
|
||||
# M3.8.4 — M3.8 Composition Gate
|
||||
# M3.8.4 — Query Path Cleanup (IMPLICIT - COMPLETE)
|
||||
|
||||
| Field | Value |
|
||||
|---|---|
|
||||
| Phase | M3.8 — Context optimization |
|
||||
| Size | M — 1 day |
|
||||
| Status | ⬜ Not started |
|
||||
| Depends | M3.8.3 (benchmarks) |
|
||||
| Blocks | M3.9 |
|
||||
| Size | S — 0 days (no changes needed) |
|
||||
| Status | ✅ COMPLETE |
|
||||
| Depends | M3.8.3 |
|
||||
| Blocks | M3.8.5 |
|
||||
|
||||
## Goal
|
||||
## Summary
|
||||
|
||||
Verify M3.8 implementation meets safety and performance constraints across
|
||||
realistic failure scenarios.
|
||||
✅ **IMPLICIT COMPLETION**
|
||||
|
||||
## Gate Assertions
|
||||
When M3.8 architecture was corrected (ingest vs query), the query path was already clean:
|
||||
|
||||
### Safety (6 assertions)
|
||||
1. **No data loss** — CCR store retrieves 100% of compressed content
|
||||
2. **Cache correctness** — Drift metric accurate (< 5% error vs. actual)
|
||||
3. **Compression lossless** — Decompressed == original (where applicable)
|
||||
4. **Format stability** — JSON/diff/log structures preserved
|
||||
5. **Error graceful** — Optimizer failure doesn't crash pipeline
|
||||
6. **Thread-safe** — Concurrent optimizations don't corrupt state
|
||||
**Current State:**
|
||||
- ❌ NO query-path compression in `build_cache_aligned()`
|
||||
- ✅ Only `cache_metrics()` calls optimizer (for metrics collection only, not compression)
|
||||
- ✅ Actual chunks sent to LLM are unmodified
|
||||
- ✅ Optimization happens at ingest time via M3.8.2 helpers
|
||||
|
||||
### Performance (4 assertions)
|
||||
1. **Latency** — Per-chunk optimization < 3ms (p99)
|
||||
2. **Cache hit rate** — Stable prefix unchanged >= 70% across queries
|
||||
3. **Throughput** — 1000 chunks/sec sustained
|
||||
4. **Memory** — Cache size stays < 100MB (max 1000 entries @ 100KB each)
|
||||
**What Didn't Need Changing:**
|
||||
- `PromptBuilder::build_cache_aligned()` — Already doesn't compress chunks
|
||||
- `PromptBuilder::cache_metrics()` — Only uses optimizer for token estimation (okay for metrics)
|
||||
- `PromptBuilder::build()` — Legacy path, unmodified
|
||||
|
||||
### Quality (3 assertions)
|
||||
1. **Compression met** — All 4 content types meet targets
|
||||
2. **No false positives** — Cache eligible when drift < 0.3
|
||||
3. **Coverage** — Benchmarks > 95% compression code paths
|
||||
**Why This is Better:**
|
||||
- Clean separation: ingest optimizes, query doesn't
|
||||
- LLM gets pre-optimized chunks from search results
|
||||
- No per-query optimization overhead
|
||||
- Cache metrics track drift for observability (non-destructive)
|
||||
|
||||
## Test Implementation
|
||||
## Verification
|
||||
|
||||
File: `tests/it_m3_8_gate.rs` (200 LOC)
|
||||
|
||||
```rust
|
||||
#[test]
|
||||
fn m3_8_gate_no_data_loss() { ... }
|
||||
|
||||
#[test]
|
||||
fn m3_8_gate_cache_correctness() { ... }
|
||||
|
||||
#[test]
|
||||
fn m3_8_gate_compression_targets() { ... }
|
||||
|
||||
#[test]
|
||||
fn m3_8_gate_latency_p99() { ... }
|
||||
|
||||
#[test]
|
||||
fn m3_8_gate_concurrent_safety() { ... }
|
||||
|
||||
#[test]
|
||||
fn m3_8_gate_cache_hit_rate() { ... }
|
||||
All prompt tests still passing (11 tests):
|
||||
```
|
||||
test prompt::tests::test_cache_aligned_chunk_budget_exceeded ... ok
|
||||
test prompt::tests::test_cache_aligned_contains_query ... ok
|
||||
test prompt::tests::test_cache_aligned_memory_budget_exceeded ... ok
|
||||
test prompt::tests::test_cache_aligned_produces_two_user_messages ... ok
|
||||
test prompt::tests::test_cache_prefix_is_stable_across_chunks ... ok
|
||||
test prompt::tests::test_cache_prefix_is_stable_across_memory_changes ... ok
|
||||
test prompt::tests::test_cache_prefix_tokens_positive ... ok
|
||||
test prompt::tests::test_headroom_positive_under_budget ... ok
|
||||
test prompt::tests::test_legacy_build_still_works ... ok
|
||||
test prompt::tests::test_render_chunk_multiple_roles ... ok
|
||||
test prompt::tests::test_render_chunk_single_record ... ok
|
||||
```
|
||||
|
||||
Tests: 6 (safety) + 4 (performance) + 3 (quality) = 13 total
|
||||
## Files Verified
|
||||
|
||||
## Acceptance
|
||||
- `crates/mem-core/src/prompt.rs` — No query-path compression
|
||||
- `crates/mem-core/src/optimizer/mod.rs` — Optimizer available for metrics only
|
||||
- No changes required
|
||||
|
||||
✅ All 13 gate assertions passing
|
||||
✅ 117+ optimizer unit tests passing
|
||||
✅ Benchmarks meeting compression targets
|
||||
✅ No regressions in other modules (prompt, query, etc.)
|
||||
✅ Documentation complete (CONTEXT_OPTIMIZER.md, headers in code)
|
||||
## Status
|
||||
|
||||
## Success Criteria
|
||||
✅ **Complete**
|
||||
|
||||
- M3.8.4 gate 100% pass rate
|
||||
- Zero blocking issues from integration tests
|
||||
- Ready for M3.8 → production hand-off
|
||||
This task represents "no work needed" because the architecture was corrected upfront:
|
||||
- Optimizer at ingest (M3.8.2) ✅
|
||||
- Metrics collection in query (M3.8.3) ✅
|
||||
- No compression in query ✅
|
||||
|
||||
The query path is already clean.
|
||||
|
||||
Reference in New Issue
Block a user