# Milestone 6 · Full Surface Coverage (✅ COMPLETE 2026-02-23) Milestone spec, thesis, UAT scenario, and per-phase acceptance criteria: [ROADMAP · Milestone 6](../ROADMAP.md). > **These are backfilled records, not the original plans.** M6 shipped in the > squashed commit `213b8ef` (2026-02-23, "complete M6-M7 + Enterprise Readiness > milestones") before this project kept per-milestone planning directories. The > six phase docs here were written after the fact (2026-08-30) from the ROADMAP > acceptance criteria, the shipped source tree, and the M6 test suite. Every > claim names the artifact that proves it, and where the shipped surface diverges > from the ROADMAP text the phase doc says so instead of restating the plan. ## What the milestone proves Every use case in [USE_CASES.md](../../../USE_CASES.md), every sort mode, every filter, and every feedback loop resolves inside one query engine — cohort-scoped trending, social-graph scoping and collaborative filtering, the full sort surface, collections and saved searches, scoped SEARCH plus autocomplete, and notification capping — with no application-side ranking logic left over. ## Phases | Phase | Name | Record | Primary test | |-------|------|--------|--------------| | m6p1 | Cohort Engine + Cohort-Scoped Trending | [phase-1.md](phase-1.md) | `tidal/tests/m6_cohort.rs` (12) | | m6p2 | Social Graph + Collaborative Filtering | [phase-2.md](phase-2.md) | `tidal/tests/m6_social.rs` (8) | | m6p3 | Full Sort Modes + Live Content + Engagement Filters | [phase-3.md](phase-3.md) | `tidal/tests/m6p3_sorts.rs` (9), `m6p3_filters.rs` (3), `m6p3_edge_cases.rs` (3) | | m6p4 | Collections + Watch History + Saved Searches | [phase-4.md](phase-4.md) | `tidal/tests/m6p4_collections.rs` (10) | | m6p5 | Query Composition + SUGGEST Autocomplete | [phase-5.md](phase-5.md) | `tidal/tests/m6p5_scope.rs` (13) | | m6p6 | Notification Capping + Adaptive Preferences + M6 UAT | [phase-6.md](phase-6.md) | `tidal/tests/m6_uat.rs` (9), `m6p6_creator_profile.rs` (6) | Test counts are `#[test]` functions in the working tree today; the ROADMAP status rows record the smaller counts these files had at close (e.g. m6p1 closed at "9 m6_cohort"). The suites grew with later hardening — most visibly `tidal/tests/m6_crash_surfaces.rs` (4) and `tidal/tests/m7_crash_m6.rs`, added by M7 to crash-fence the state M6 introduced. ## Shipped surface (verified against the working tree) | Concern | Artifact | |---------|----------| | Cohort definitions, predicates | `tidal/src/cohort/types.rs` | | Cohort membership resolution | `tidal/src/cohort/resolver.rs` | | Per-cohort signal aggregation | `tidal/src/cohort/ledger.rs` | | Cohort checkpoint/restore | `tidal/src/cohort/checkpoint.rs` | | Cohort db API | `tidal/src/db/cohorts.rs` | | Social-graph filter | `tidal/src/query/executor/social_filter.rs` | | Co-engagement / collaborative filtering | `tidal/src/entities/co_engagement.rs` | | Collections | `tidal/src/entities/collection.rs`, `tidal/src/db/collections.rs` | | Saved searches | `tidal/src/session/saved_search.rs` | | SUGGEST autocomplete | `tidal/src/query/suggest.rs` | | Notification capping | `tidal/src/db/notification_tracker.rs` | | Adaptive preference learning rate | `tidal/src/entities/preference.rs` | | Sort surface | `tidal/src/ranking/profile.rs` (`Sort`), `tidal/src/ranking/executor/tests/sort_tests.rs` | | Benchmarks added by M6 | `tidal/benches/social.rs`, `tidal/benches/sort.rs` | All 62 M6 acceptance criteria in [ROADMAP · Milestone 6](../ROADMAP.md) are marked `[x]`. Recorded at close: 1,082 total (835 lib + 247 integration), 9 `m6_uat` passing; re-verified 2026-02-24 at 1,206 lib + 70 M6 integration tests. ## Divergences found while writing these records Three ROADMAP criteria describe behaviour the shipped code deliberately does not have. Each is documented in the source itself, and each is recorded in the relevant phase doc rather than smoothed over here: 1. Co-engagement eviction is **minimum-weight**, not LRU (phase-2). 2. The `related` blend is **additive with a 0.3 co-engagement term**, not the convex combination `0.6/0.3/0.1` (phase-2). 3. Per-user preference `update_counts` were documented as unpersisted and "deferred to M7"; they are in fact persisted now, and by M12, not M7 (phase-6).