Review source
Round 14 (Opus 4.8 + Gemini) — API Design.
Problem
Field-casing inconsistency: webhook responses use tenantId/workspaceId (camelCase) while API-key responses use workspace_id/created_at (snake_case). Error-body shape drifts: the 500 handler returns {error, message} while everything else returns {error, errorCode, reason}.
Fix
- Decide on ONE convention (snake_case is more Pythonic and matches most of the API) and apply it everywhere
- Migrate webhook response schemas from camelCase to snake_case (or add Pydantic alias for backward compat with a deprecation note)
- Unify ALL error responses to {error, errorCode, reason} including the 500 handler
- Update OpenAPI spec + SDK models to match
Acceptance Criteria
- All response fields use consistent casing (snake_case)
- All error responses (including 500) use {error, errorCode, reason}
- Contract test asserts error-body shape consistency
- mypy clean, ruff clean, tests >= baseline
Review source
Round 14 (Opus 4.8 + Gemini) — API Design.
Problem
Field-casing inconsistency: webhook responses use tenantId/workspaceId (camelCase) while API-key responses use workspace_id/created_at (snake_case). Error-body shape drifts: the 500 handler returns {error, message} while everything else returns {error, errorCode, reason}.
Fix
Acceptance Criteria