miroir/notes/phase1-core-routing-completion.md
jedarden 1136291100 Phase 1 - Core Routing: Complete verification
Verified all Definition of Done requirements for miroir-cdo bead:

Router Module (router.rs):
-  Determinism verified by test_determinism()
-  Minimal reshuffle on add (test_reshuffle_bound_on_add)
-  Uniformity: 64 shards / 3 nodes / RF=1 → 17-26 shards/node
-  RF=2 placement stability (test_rf2_placement_stability)
-  write_targets returns RG × RF nodes
-  query_group distributes evenly (chi-square test)
-  covering_set covers all shards with replica rotation

Topology Module (topology.rs):
-  Topology struct with node grouping
-  Complete health state machine
-  YAML serialization (plan §4 format)

Scatter Module (scatter.rs):
-  Fan-out orchestration with plan_search_scatter()
-  Execution primitives with mock client
-  OP#4 Global-IDF preflight (dfs_query_then_fetch)
-  Session pinning support
-  Settings version floor filtering

Merger Module (merger.rs):
-  RRF merge strategy (k=60 default)
-  Score-based merge for global-IDF
-  Global sort, offset/limit, facet aggregation
-  Field stripping, tie-breaking, degraded handling

Test Results: 103 Phase 1 tests, all passing

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 14:05:01 -04:00

86 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 1 - Core Routing: Completion Summary
## Bead: miroir-cdo
**Status**: ✅ COMPLETE
## Definition of Done Verification
### Router Module (router.rs)
-**Determinism**: `test_determinism()` verifies same inputs produce same output
-**Minimal reshuffle on add**: `test_reshuffle_bound_on_add()` verifies adding 4th node to 3-node group moves at most ~2 × (1/4) shards
-**Uniformity**: `test_uniformity()` verifies 64 shards / 3 nodes / RF=1 → each node holds 17-26 shards
-**RF=2 placement stability**: `test_rf2_placement_stability()` and `test_reshuffle_bound_on_remove()` verify minimal changes on add/remove
-**write_targets**: `test_write_targets_returns_rg_x_rf_nodes()` and `test_write_targets_one_per_group()` verify RG × RF nodes, one per group
-**query_group**: `test_query_group_uniform_distribution()` verifies even distribution (chi-square test)
-**covering_set**: `test_covering_set_covers_all_shards()`, `test_covering_set_size_bound()`, `test_covering_set_determinism()`, `test_covering_set_rotates_replicas()` verify correct coverage
-**shard_for_key**: `test_shard_for_key_fixture()` verifies hash-based routing
### Topology Module (topology.rs)
-**Topology struct**: Holds nodes grouped by `replica_group`
-**Node health state machine**: Full state transition table (Joining → Active → Draining → Removed, with Degraded/Failed states)
-**Group isolation**: `each_group_holds_exactly_its_configured_nodes()` verifies groups are independent
-**YAML serialization**: `deserialize_plan_s4_yaml_example()` verifies plan §4 format
### Scatter Module (scatter.rs)
-**Fan-out orchestration**: `plan_search_scatter()` builds shard→node mapping
-**Execution primitives**: `execute_scatter()` fans out to nodes with mock client support
-**OP#4 Global-IDF preflight**: `execute_preflight()` and `dfs_query_then_fetch_search()` implement the preflight phase
-**Session pinning**: `plan_search_scatter_for_group()` supports pinned group reads
-**Settings version floor**: `plan_search_scatter_with_version_floor()` implements plan §13.5
### Merger Module (merger.rs)
-**RRF merge**: Default strategy with k=60, fully tested
-**Score-based merge**: For OP#4 global-IDF queries
-**Global sort by score**: `test_score_merge_global_sorting()`
-**Offset/limit**: `test_merge_offset_limit()`, `test_page_reconstruction()`
-**Facet aggregation**: `test_merge_facets()`, `test_merge_facets_filter()`
-**Field stripping**: `test_merge_strips_miroir_fields()`
-**Tie-breaking**: Deterministic by primary key
-**Degraded handling**: `test_merge_degraded_flag()`
## Test Results
```
running 15 tests (router)
test result: ok. 15 passed
running 24 tests (topology)
test result: ok. 24 passed
running 25 tests (scatter)
test result: ok. 25 passed
running 39 tests (merger)
test result: ok. 39 passed
Total: 103 Phase 1 tests, all passing
```
## Implementation Details
### Rendezvous Hashing (HRW)
- Uses `twox_hash::XxHash64` with seed 0 (matches Meilisearch Enterprise)
- Scores are `hash(shard_id, node_id)` → 64-bit integer
- Top-RF nodes selected by score descending, with lexicographic tie-breaking
### Properties Verified
1. **Determinism**: All pods compute identical assignments given fixed topology
2. **Minimal reshuffling**: Adding node moves ~1/(Ng+1) of shards
3. **Group isolation**: Intra-group hashing prevents both replicas in same group
### Dependencies
- `twox-hash` for rendezvous hashing
- `serde` for serialization
- `tokio` for async execution
## Notes
Phase 1 - Core Routing was already fully implemented with comprehensive test coverage. The rendezvous hashing, topology management, scatter orchestration, and result merger primitives are all in place and passing all tests.
The implementation correctly handles:
- Deterministic shard assignment without coordination
- Minimal data movement on topology changes
- Group-scoped assignment for replica isolation
- Global sort with RRF and score-based merge
- OP#4 global-IDF preflight for cross-shard score comparability