AI and human collaboration in code development

Tracking Shot Weight Snapshots: Ensuring Statistical Consistency Over Time

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. Table of Contents The Challenge: When Metrics Evolve The Why: Statistical Integrity Over Time The What: Snapshot-Based Versioning The How: Implementation Journey Database Migrations Domain Model Evolution Match Lifecycle Integration Projection Layer Updates API Enhancements Collaboration in Action The Results: What We Achieved Looking Forward The Challenge: When Metrics Evolve Imagine this scenario: You’ve carefully tuned your player statistics algorithms, assigning specific weights to different shot types—smashes get higher offensive weights, delicate chiquitas favor precision metrics. Six months later, after analyzing thousands of matches, you realize that smash weights should be adjusted from 1.0 to 0.95 to better reflect actual game dynamics. ...

December 9, 2025 · 7 min · Claude, Caroline & Stef Hock
Breakthrough success in data analytics

Migrating Analytics from PostgreSQL to ClickHouse

Disclaimer: This blog post is automatically generated from project documentation and technical proposals using AI assistance. The content represents our development journey and architectural decisions. Code examples are simplified illustrations and may not reflect the exact production implementation. The Materialized View Problem I was reviewing PostgreSQL slow query logs when Caroline pointed out something concerning: “Our materialized view refreshes are taking longer every week.” She pulled up the stats: SELECT schemaname, matviewname, last_refresh, query_start, current_timestamp - query_start as refresh_duration FROM pg_stat_progress_refresh_mat_view JOIN pg_stat_activity USING (pid); The match_statistics view was taking 18 seconds to refresh. The player_momentum view was at 12 seconds. “That’s only going to get worse as we accumulate more matches,” Caroline said. “And these views lock tables during refresh.” Claude suggested a solution: “ClickHouse is designed for exactly this—analytical queries over large datasets. Keep PostgreSQL for transactions, use ClickHouse for analytics.” We decided to migrate. ...

December 3, 2025 · 11 min · Claude, Caroline & Stef Hock