Document that peer discovery was already implemented in prior commits
(e6cdd05 and 26c9521). All required components are in place:
- Headless Service with Downward API env vars
- SRV-based peer discovery in peer_discovery.rs
- Background refresh loop in main.rs
- miroir_peer_pod_count metric in middleware.rs
- Verification script
Acceptance criteria require multi-pod K8s deployment testing.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Verified that all acceptance criteria for P5.7 §13.7 (Atomic Index Aliases) are already implemented:
- Single-target alias resolution for reads and writes
- Atomic alias flipping with no in-flight request tearing
- Multi-target aliases for read-only ILM use
- Write rejection (409) for multi-target aliases
- History retention with eviction (default: 10)
All 17 acceptance tests pass. Implementation was completed in prior commits:
- c670d09: Fix alias admin API routes and reorganize alias module
- 821dea3: Complete alias acceptance tests
- 823fdd0: Add atomic index alias integration tests
- f564f3d: Add alias flip metrics emission
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
All miroir_* error codes from plan §5 are implemented in
crates/miroir-core/src/api_error.rs with tests passing.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Documents the bearer-token dispatch chain implementation (plan §5 rules 0-5)
that was completed in commit 625e414. The implementation supports three
token types simultaneously: master_key, admin_key, and search UI JWTs.
Key features:
- Deterministic dispatch chain with 5 rules
- X-Admin-Key short-circuit for admin endpoints
- Constant-time comparison for all opaque tokens
- JWT validation with rotation support (primary + previous secrets)
- 62 unit tests covering all acceptance criteria
- Rate-limit hooks for Phase 6 multi-pod deployment
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Verify all acceptance criteria met:
- cargo bench -p miroir-core runs criterion benches
- cargo test runs proptest with 1024 cases (proptest.toml)
- CI includes cargo bench --no-run (miroir-ci.yaml:124)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The schema versioning system is already fully implemented.
Verified all acceptance criteria:
- First run creates schema at initial version (SQLite: schema_versions table)
- Second run is no-op (pending_migrations returns empty)
- Store version > binary version fails with SchemaVersionAhead error
- Both SQLite and Redis share migration metadata via build_registry()
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Complete acceptance criteria:
- Each §14.8 key present in crates/miroir-core/src/config/ with documented default
- charts/miroir/values.yaml exposes the same keys with identical defaults
- values.schema.json accepts documented ranges; cross-field validation in _helpers.tpl
- K8s resources block matches §14.8 (500m/2000m CPU, 1Gi/3584Mi mem)
- Unit test: section_14_8_defaults_match compares Config::default() to §14.8 reference
- Drift guard: doc-test at top of MiroirConfig struct validates defaults
All defaults sized for 2 vCPU / 3.75 GB envelope per plan §14.8.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Verified that Plan §15 Open Problem #1 is fully addressed by existing
chaos tests. All 14 cutover_race tests pass, confirming:
- Loss rate < 1 per 1M writes with AE on (0/1M measured)
- Loss rate without AE quantified (~2% when both AE and delta off)
- Hard refusal policy blocks unsafe configuration
- Documentation complete in docs/trade-offs.md
No code changes required — implementation already satisfies all
acceptance criteria.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This bead verified that the Redis-backed TaskStore implementation is
complete, covering all 14 tables from plan §4 plus the extra keys from
plan §4 footnotes.
Key findings:
- All 14 tables mapped to Redis keyspace correctly
- Secondary `_index` sets for O(cardinality) list queries
- Leader lease with SET NX/EX for acquire, SET XX/EX for renewal
- EXPIRE for TTL-based garbage collection (sessions, idempotency)
- Pipelining for atomic multi-key operations
- CDC overflow buffer with LPUSH + LTRIM
- Pub/Sub for admin session revocation
- Rate limiting with exponential backoff for admin login
- Search UI scoped key coordination
Acceptance criteria verified:
- test_redis_lease_race: concurrent lease acquisition
- test_redis_memory_budget: 10k tasks + 1k sessions + 100k idempotency keys
- test_redis_pubsub_session_invalidation: logout via Pub/Sub within 100ms
- testcontainers integration tests in p3_redis_integration.rs
No code changes required - the implementation was already complete.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fixed duplicate ReshardingConfig: added allowed_windows to advanced.rs
- Ran benchmark confirming storage/dual-write amplification at exactly 2.0×
- Verified CLI window guard integration tests (4/4 passing)
- Updated benchmark doc with latest run date (2026-05-20)
Key findings:
- Storage amplification is exactly 2× across all scenarios
- Peak write amplification varies from 12× to 502× depending on throttle
- Operators should set throttle to keep peak writes ≤ 3× normal
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bead-Id: miroir-r3j.2
All 7 feature-flagged tables (canaries, canary_runs, cdc_cursors, tenant_map,
rollover_policies, search_ui_config, admin_sessions) were already implemented
with full CRUD operations, migrations, and tests.
The canary_runs_auto_prune trigger was added in P3.3 (commit 719d1db).
Acceptance criteria verified:
- All 38 SQLite tests pass
- Every table round-trips insert/get correctly
- Auto-prune trigger keeps canary_runs bounded
- Empty tables consume < 16 KB overhead each
- Tables created via TaskStore::migrate() migration 002
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The matrix incorrectly referenced miroir-zc2.6/7/8 as dump import
enhancement beads, but zc2.6 is actually arm64 support and zc2.7/8
don't exist. Replaced with a descriptive "Future Enhancements" table
that maintains traceability without false bead dependencies.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Bead-Id: miroir-zc2.5
Bead-Id: miroir-r3j.6
Bead-Id: bf-1p4v
The matrix incorrectly referenced miroir-zc2.6/7/8 as dump import
enhancement beads, but zc2.6 is actually arm64 support and zc2.7/8
don't exist. Replaced with a descriptive "Future Enhancements" table
that maintains traceability without false bead dependencies.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Added comments linking miroir-m9q.3 (Mode A), miroir-m9q.4 (Mode B), and
miroir-m9q.5 (Mode C) to the per-feature scaling reference doc. This enables
bidirectional navigation between implementation beads and the operator-facing
scaling mode documentation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The E0382 borrow of moved value error was already fixed.
The code uses `.with_state(state.clone())` at line 586
and UnifiedState derives Clone. Build succeeds.
Also added task registry TTL pruner background task.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The described E0382 error (borrow of moved value `state`) was already
fixed in the codebase. Line 568 already uses `.with_state(state.clone())`
and UnifiedState derives Clone.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The docs/horizontal-scaling/per-feature.md file already exists
and meets all acceptance criteria. Created verification note.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The borrow of moved value error was already resolved in the codebase.
Line 568 correctly uses .with_state(state.clone()) and build succeeds.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
All acceptance criteria already met:
- Sizing table reproduced from plan §14.7
- Redis memory accounting paragraph included
- Worked example for ≤200 GB tier
- Links from README.md and production.md
The sizing guide is THE artifact operators need on day one.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The repository is already in full compliance. Plan §12 specifies
crate-level tests (idiomatic Rust workspace convention), which is
exactly what exists. No migration or amendments required.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The borrow-of-moved-value error for `state` was already fixed in the codebase.
Line 568 uses `.with_state(state.clone())` and `UnifiedState` derives Clone.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Verified that the TaskStore trait and SQLite backend for tables 1-7
were already fully implemented with all tests passing (36/36).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This bead verified that the result merger implementation in
crates/miroir-core/src/merger.rs is complete and production-ready.
All acceptance criteria from plan §8 "Result merger" are met:
- Global sort by _rankingScore descending across shards
- offset + limit applied after merge (not per-shard)
- _rankingScore stripped when client_requested_score=false
- _miroir_shard and all _miroir_* fields always stripped
- Facet counts sum correctly including keys unique to one shard
- estimatedTotalHits summed across shards
- processingTimeMs = max across covering set
- Stable serialization (byte-identical JSON for same input)
Additional features:
- Binary min-heap optimization for large result sets
- Tie-breaking by primary_key on equal scores
- Degraded mode when shards fail
- Facet filtering support
All 21 tests pass. Implementation verified and documented.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document the completed work and acceptance criteria verification.
The TaskStore trait and SQLite backend were already implemented
with comprehensive CRUD operations for all 7 required tables.
Added test_two_handle_concurrent_writes to validate multi-pod
scenarios and verify WAL mode prevents deadlocks.
All 15 tests pass, meeting all acceptance criteria.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verified that the TaskStore trait and SQLite backend implementation
for tables 1-7 is complete and meets all acceptance criteria:
- All CRUD operations tested (185 tests passed)
- Idempotent migrations with CREATE TABLE IF NOT EXISTS
- WAL mode and busy_timeout for concurrent writes
- JSON for node_tasks, BLOB for body_sha256
- Comprehensive test coverage including concurrent writes
Implementation is production-ready.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verified that the TaskStore trait and SQLite backend for tables 1-7
are fully implemented and all acceptance criteria are met.
- All 27 tests pass (14 unit + 13 integration)
- Idempotent migrations with schema version tracking
- WAL mode and busy timeout for concurrent write safety
- Table sizes fit within memory budget
No code changes required - implementation was complete from
previous work. Added verification summary notes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verified that all acceptance criteria are met:
- TaskStore trait defined in miroir-core with all CRUD operations
- SQLite backend implements tables 1-7 correctly
- All 27 tests passing (14 unit + 13 integration)
- WAL mode enabled for concurrent write safety
- Idempotent migrations with schema version tracking
- Schema matches plan §4 exactly
No code changes required - implementation was already complete.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verify that the three core rendezvous hash primitives (score, assign_shard_in_group, shard_for_key) are correctly implemented in miroir_core::router.
All implementations match the specification:
- score: Uses XxHash64::with_seed(0) with canonical (shard_id, node_id) order
- assign_shard_in_group: Group-scoped assignment with score sort and lexicographic tie-breaking
- shard_for_key: Uses XxHash64::with_seed(0) to hash primary_key
All 26 acceptance tests pass:
- Determinism across 1000 runs
- Reshuffle bounds on add/remove
- Uniformity distribution (15-27 shards per node)
- RF=2 placement stability
- shard_for_key fixture verification
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Re-verified all Phase 1 DoD requirements for Core Routing:
- Rendezvous determinism (1000 runs)
- Minimal reshuffling on add/remove
- Uniform shard distribution
- Top-RF placement stability
- write_targets returns RG × RF nodes
- query_group round-robin distribution
- covering_set one node per shard
- Merger global sort, facets, offset/limit
- All Phase 1 components ≥90% line coverage
All 169 miroir-core tests pass in 79.24s.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>