Analytics review fixes:
- Store Twitter analytics coverage as discrete intervals instead of a single
contiguous window so disjoint fetch ranges no longer mask inner gaps as
covered (fetch per uncovered range, add gap regression tests)
- Compute real AvgEngagement/Correlation in getEngagementDrivers instead of
all-zero placeholders
- Make parseAnalyticsTimeRange surface invalid timestamps, cap merged analytics
posts at limit, and normalize sentiment by timestamped posts only
- gofmt: fix misalignment in config.go and types.go
- Include Twitter in the default aggregate analytics scope; its API costs are
passed to the caller through paid tool pricing
x402 cost passing:
- computeTwitterStyleProfileCost now charges base cost ($0.10) + user lookup
($0.01) + $0.005 per Twitter post, guaranteeing the charge always clears the
underlying API cost (never break-even or loss)
- Return a $-prefixed dollar string for the settlement override, fixing the
previously off-by-factor-100 raw-atomic-unit amount
- Raise getStyleProfile base registration to $0.36 to authorize the max Twitter
charge
- Add tests for the cost formula, profitable floor, and dollar formatting
Add tables backing the analytics cache, the permanent per-platform post
store, and the coverage watermark used to avoid re-fetching paid Twitter
posts once a time range has already been retrieved.
- Migration 002: VECTOR(768) -> VECTOR(1024) to match qwen3-embedding:0.6b default output
- integration_test.go: update test vector from 768 to 1024 dimensions
- schema: add IF NOT EXISTS to CREATE TABLE/INDEX for idempotent migrations
- store: regenerate with sqlc v1.31.1 (adds UserStylePost, interface{} for Embedding)
- webhook: minor formatting cleanup
- Rewrite GetStyleProfile, FindSimilarUsers, UpsertStyleProfiles SQL queries
to use @named parameters instead of positional placeholders
- Regenerate sqlc Go files with meaningful parameter names
- Update server.go and integration test to use new parameter field names
- Fix Similarity int32→float64 type conversion
- Add dependency-free in-process schema migrator (internal/store/migrate.go) that applies
sql/schema/*.sql in order, tracking versions in schema_migrations. Gated by MIGRATE_ON_START
and MIGRATIONS_DIR (default sql/schema).
- Fix migration ordering: 002 now creates the 'vector' extension before defining the
user_style_profiles table (previously the extension was only created later in 003).
- Bound concurrent background enrichment with a 4-slot semaphore so bursts of live
getStyleProfile calls cannot overwhelm Ollama.
- buildStyleProfile degrades gracefully when Ollama is down: stores a zero embedding and a
keyword-based fallback summary instead of failing the whole request.
- Add a /readyz side server (READYZ_PORT, default 9090) that checks DB connectivity and
Ollama availability.
Co-Authored-By: Claude (AI assistant) <noreply@anthropic.com>