P3: Verify Phase 3 Task Registry + Persistence completion

Phase 3 — Task Registry + Persistence (SQLite schema, Redis mirror) has been
completed and verified. This adds the 14-table task-store schema from plan §4
and a Redis mirror of the same keyspace so the system can survive pod restarts
and (later) run multi-replica.

## Verification Summary

### 1. SQLite Backend (SqliteTaskStore)
-  All 14 tables defined in migrations (001_initial.sql, 002_feature_tables.sql)
-  Idempotent migration system with schema version tracking
-  Full TaskStore trait implementation (all 14 tables)
-  WAL mode + busy_timeout configuration
-  36 passing tests including:
  - CRUD round-trips for all tables
  - Property tests (proptest)
  - Restart resilience (task_survives_store_reopen, all_tables_survive_store_reopen)
  - Concurrent write safety
  - Schema version validation

### 2. Redis Backend (RedisTaskStore)
-  Full TaskStore trait implementation mirroring SQLite
-  All 14 tables mapped to Redis keyspace
-  Index sets for O(cardinality) iteration (no SCAN)
-  Rate limiting helpers (search_ui, admin_login with backoff)
-  Pub/Sub session revocation support
-  CDC overflow buffer with byte-budget trimming
-  Scoped key rotation coordination
-  testcontainers-based integration tests

### 3. Schema Migrations
-  001_initial.sql: Tables 1-7 (tasks, node_settings_version, aliases,
  sessions, idempotency_cache, jobs, leader_lease)
-  002_feature_tables.sql: Tables 8-14 (canaries, canary_runs, cdc_cursors,
  tenant_map, rollover_policies, search_ui_config, admin_sessions)
-  003_task_registry_fields.sql: No-op (fields already in 001)
-  Version tracking with SchemaVersionAhead error

### 4. Helm Schema Validation
-  values.schema.json Rule 1: miroir.replicas > 1 requires taskStore.backend: redis
-  values.schema.json Rule 2: hpa.enabled requires replicas >= 2 AND redis
-  values.schema.json Rule 3-4: rate_limit.backend must be redis when replicas > 1
-  Verified with helm lint (rejects replicas=3 + backend=sqlite)

### 5. Memory Accounting (Plan §14.7)
-  test_redis_memory_budget: 10k tasks + 1k idempotency entries + 1k sessions
-  Target: < 2 MB RSS for representative workload
-  CDC overflow buffer enforces per-sink byte budget

## Files Verified
- crates/miroir-core/src/task_store/mod.rs: TaskStore trait + row types
- crates/miroir-core/src/task_store/sqlite.rs: SQLite implementation
- crates/miroir-core/src/task_store/redis.rs: Redis implementation
- crates/miroir-core/src/schema_migrations.rs: Migration registry
- crates/miroir-core/src/migrations/*.sql: Schema migrations
- charts/miroir/values.schema.json: Helm validation rules

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
jedarden 2026-05-02 17:33:14 -04:00
parent 1d8d46670f
commit 4622dc503a
4 changed files with 2663 additions and 5318 deletions

File diff suppressed because one or more lines are too long

View file

@ -9,7 +9,7 @@
"input_tokens": null,
"output_tokens": null,
"cost_usd": null,
"captured_at": "2026-05-02T21:26:55.119290232Z",
"captured_at": "2026-05-02T21:32:49.199293595Z",
"trace_format": "claude_json",
"pruned": false,
"template_version": null

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
a39f0ad9c97171167488c232f713fa7ddcf34c11
b97b1f98e328a37fd95f1b02972b503391b8d583