- Accept .json files in import upload, send format to backend
- Backend endpoint PUT /import/sessions/{id}/profile/{profile_id}
- Load saved presets on mapping step, auto-apply and skip to preview
- Save current mapping as preset on confirm step
- Delete presets from mapping step
- Remove sqlx 'macros' feature — migrated to runtime queries in f4fd915,
proc-macro crates (sqlx-macros-core, sqlx-macros) were dead weight
- Add [profile.dev] debug=1 (line tables only) + split-debuginfo=unpacked
to speed up linking on macOS
- Add [profile.dev.package.'*'] opt-level=2 to compile deps faster at
runtime; one-time cost on first build, cached after that
Match the application crate convention: each source file references its
tests via #[cfg(test)] #[path = "tests/filename.rs"] mod tests; with
the test code in a sibling tests/ directory.
- events.rs -> tests/events.rs
- value_objects.rs -> tests/value_objects.rs
- models/mod.rs -> models/tests/mod.rs (renamed from tests.rs)
- models/person.rs -> models/tests/person.rs
- models/goal.rs -> models/tests/goal.rs
- models/watch_event.rs -> models/tests/watch_event.rs
- services/review_history.rs -> services/tests/review_history.rs
Queries were migrated to the runtime sqlx API (no query! macros) in
f4fd915, making the pre-verified .sqlx cache obsolete. The directory
is also gitignored, so the COPY would break any fresh build.
- Broadcast GoalUpdated AP note after ReviewLogged so federated goal
progress reflects the new review count without requiring a manual goal edit
- Add attribution check in GoalObjectHandler::on_update (mirrors
review_handler) to prevent any remote actor from overwriting another's goal
- Implement on_actor_removed in GoalObjectHandler via new
RemoteGoalRepository::remove_all_by_actor — remote goals were never
cleaned up when an actor unfollowed or was deleted
- Add remove_all_by_actor to SQLite, Postgres, Noop, and test Panic impls
Split domain/models/mod.rs (630 lines) into focused files:
movie.rs, review.rs, user.rs, stats.rs, enrichment.rs, feed.rs.
Move URL/date formatting from application use cases to
presentation mappers — use cases now return raw domain data.
Delete watchlist/get_page.rs (was pure presentation logic),
replace with presentation/mappers/watchlist.rs.
Document signature conventions in CONTRIBUTING.md.
Extract ReviewLogger trait to decouple import/integrations
from diary::log_review (cross-module coupling smell).
Add in-memory fakes for all repository ports, enabling
isolated testing of every use case module without a database.
Coverage: domain+application 22% → 80%, 427 tests.
New movies had no poster at AP broadcast time (race between poster sync
and ReviewLogged handler). PosterSynced event now fires after sync
completes, triggering Update notes so remote apps get the poster URL.