ReviewOS

stacks/wildloop

Recompute denormalized counters (kudos_count, trail rating/review_count)

#973
Closed glennmichael123 opened this 9 days ago ·
9 days ago

Problem

activities.kudos_count and trails.rating/review_count are only set by factories and never recomputed when kudos/reviews are created or deleted, so they drift.

Acceptance

  • After-write hooks (or scheduled recompute) keep counters in sync.
  • Trail rating = avg of review ratings; review_count = count.
9 days ago

Partially addressed: activities.kudos_count is now recomputed from kudos rows on every toggle (KudosToggleAction, commit dc71d02). Still open: trails.rating / review_count recompute when reviews are created/deleted.

9 days ago

Done in bde68a4.

  • After-write hooks: activities.kudos_count was already recomputed from rows on every kudos toggle; now trails get the same treatment — the new TrailReviewStoreAction (POST /trails/{id}/reviews, auth, one review per user per trail with upsert) recomputes trails.rating (avg, 1 decimal) and review_count (count) from review rows after every write.
  • Drift repair sweep: recomputeDenormalizedCounters() rebuilds every counter from source-of-truth rows — exposed as buddy counters:recompute (--dry-run supported), POST /maintenance/recompute-counters, and shared pure math in resources/functions/counters.ts.
  • Honest seeds: seed-game-world now seeds 39 trail reviews and runs the sweep, so the factory rating/review_count numbers are replaced with values derived from real rows (and re-seeding is idempotent under the new unique index).

Verified by scripts/verify-counters.ts (17 checks): created review updates trail aggregates exactly, edited review re-averages, manually corrupted counters (rating 4.9/999 reviews, kudos_count 42) repaired to row-truth, second sweep fixes nothing. All 7 suites green.

Sign in to comment on this issue.